我下载了一个Maple proc,它返回表达式的向量(例如,v),其中每个表达式都是以具有符号条目的其他向量(p,a)表示的。例如:
> v := myProc();
> v[1];
p[2] + a[1]
> v[2];
p[5] + a[3] + sqrt(a[1])
...
如果将向量'a‘和'p’定义为向量'a‘和'p’,那么在向量'v‘生成后,我希望能够通过将数值赋给向量’p‘和’a‘来计算它的表达式:
a := Vector(3,1):
p := Vector(5,2):
我得到了这样的结果:一个向量的值被重新分配,而另一个向量的值没有:
> v[1];
p[2] + 1
> v[2];
p[5] + 1 + sqrt(1)
如能对这一问题的性质有任何见解,将不胜感激。我一直在研究与这个proc相对应的Maple文件,试图在Vectors返回表达式之前将值赋值给'p‘和'a’,但这相对来说是不成功的,因为我对Maple比较陌生,主proc中的许多子过程似乎最终需要符号向量才能成功地返回Vector 'v‘。
发布于 2013-10-03 16:41:56
第一个向量中由p[i]
返回的条目中的xearm
被称为转义的局部变量。因此,它们与全局p
向量的条目有不同的地址,这就是它们无法按照您的预期进行计算的原因。
你可以这样做,如下所示。替换,
v:=f[1];
通过,
v:=f[1];
v:=convert(v,`global`);
a[i]
和b[i]
在xearm
返回的第一个结果中似乎被索引到全局名称a
和b
中,并且没有与p[i]
相同的问题。
使用我先前答案中正确使用的示例,这里有一个有问题的版本,它显示了类似的行为。
restart:
myProc:=proc()
local w, p;
w:=Vector(2);
w[1]:=p[2] + a[1];
w[2]:=p[5] + a[3] + sqrt(a[1]);
return w;
end proc:
v:=myProc():
v[1];
p[2] + a[1]
v[2];
(1/2)
p[5] + a[3] + a[1]
a:=Vector(3,1):
p:=Vector(5,2):
v[1];
p[2] + 1
v[2];
p[5] + 2
v:=convert(v,`global`):
v;
[3]
[ ]
[4]
发布于 2013-10-03 09:03:18
您是否完全确定p
已成功地作为调用Vector(5,2)
的结果分配给
以下的工作,对我来说,如预期。
restart:
myProc:=proc()
local w;
w:=Vector(2);
w[1]:=p[2] + a[1];
w[2]:=p[5] + a[3] + sqrt(a[1]);
return w;
end proc:
v:=myProc():
v[1];
p[2] + a[1]
v[2];
(1/2)
p[5] + a[3] + a[1]
a:=Vector(3,1):
p:=Vector(5,2):
v[1];
3
v[2];
4
我可以想出一些棘手的方法来编写myProc
,这样它的行为就像您所描述的那样,但它们大多都是人为的。例如,我可以在p[5]
和p[2]
的实例周围放置两对未计算的引号(两对左单引号)。
如果在查询v[2]
(并获得涉及未评估的索引引用到p
的意外输出)之后立即发出命令,您会得到什么信息?
%;
如果在有问题的情况下,你只发出命令,
p;
如果在有问题的地方发出命令,你会得到什么
map(eval,v);
您是否可以向myProc
的源提供一个URL
https://stackoverflow.com/questions/19164131
复制相似问题