我下载了一个 Maple 过程,它返回表达式的向量(比如 v),其中每个单独的表达式都以其他向量 (p, a) 和符号条目表示。 例如:
> v := myProc();
> v[1];
p[2] + a[1]
> v[2];
p[5] + a[3] + sqrt(a[1])
...
我希望能够通过为向量"p"和"a"分配数值来计算生成矢量"v"中的表达式,但是如果我按如下方式定义矢量"a"和"p":
a := Vector(3,1):
p := Vector(5,2):
我得到的结果是一个 Vector 的值被重新分配,但另一个 Vector 的值没有:
> v[1];
p[2] + 1
> v[2];
p[5] + 1 + sqrt(1)
如能深入了解这一问题的性质,将不胜感激。 我一直在浏览与此过程对应的 Maple 文件,以尝试在向量"v"返回表达式之前为"p"和"a"赋值,但这相对不成功,因为我对 Maple 相对较新,主进程中的众多子过程似乎最终需要符号向量才能成功返回向量"v"。
xearm
返回的第一个 Vector 中条目中的p[i]
是所谓的转义局部变量。因此,它们的地址与全局p
Vector的条目不同,这就是它们无法按预期进行评估的原因。
您可以像下面这样解决这个问题。取代
v:=f[1];
由
v:=f[1];
v:=convert(v,`global`);
xearm
返回的第一个结果中的a[i]
和b[i]
似乎已索引到全局名称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]
您是否完全确定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
以便它的行为符合您的描述,但它们大多是相当人为的。例如,我可以在myProc
体内的p[5]
和p[2]
实例周围放置两对未评估引号(两对左单引号)。
如果在查询v[2]
(并获得涉及对p
的未计算索引引用的意外输出)后立即发出命令,您会得到什么,
%;
?
如果在有问题的地方,你只发出命令,你会得到什么,
p;
?
如果在有问题的地方发出命令,你会得到什么,
map(eval,v);
?
您是否可以自由地提供myProc
来源的 URL?