我下载了一个Maple proc,它返回一个Vector(比方说,v)表达式,其中每个单独的表达式都是带有符号条目的其他Vector(p,a)。例如:
> v := myProc();
> v[1];
p[2] + a[1]
> v[2];
p[5] + a[3] + sqrt(a[1])
...
我希望能够通过为Vector'p'和'a'分配数值来评估Vector'v'中生成后的表达式,但是如果我定义了Vector'a '和'p'如下:
a := Vector(3,1):
p := Vector(5,2):
我得到一个结果,其中一个Vector的值被重新分配,但其他Vector的值不是:
> v[1];
p[2] + 1
> v[2];
p[5] + 1 + sqrt(1)
任何有关此问题性质的见解将不胜感激。我一直在浏览与此proc相对应的Maple文件,试图在Vector'v'返回表达式之前为'p'和'a'赋值,但这相对不成功,因为我对Maple相对较新,主过程中的众多子过程似乎最终需要符号向量来成功返回向量'v'。
答案 0 :(得分:0)
您是否完全确定已将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]
和myProc
的实例周围放置两对无评价引号(两对单引号)。
如果在查询v[2]
之后立即获得(并获得涉及p
的未评估索引引用的意外输出),那么您将发出命令,
%;
如果在问题点上你只发出命令
,你会得到什么?p;
如果在问题点发出命令
,你会得到什么?map(eval,v);
您是否可以自由地提供myProc
来源的网址?
答案 1 :(得分:0)
p[i]
返回的第一个Vector条目中的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]