0

式のベクトル (v など) を返す Maple proc をダウンロードしました。ここで、個々の式は、シンボリック エントリを持つ他のベクトル (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):

1 つのベクターの値が再割り当てされているが、他のベクターの値は再割り当てされていないという結果が得られます。

> v[1]; 
p[2] + 1
> v[2];
p[5] + 1 + sqrt(1)

この問題の性質に関する洞察をいただければ幸いです。Vector 'v' が式を返す前に、このプロシージャに対応する Maple ファイルを調べて 'p' と 'a' に値を代入しようと試みましたが、これは比較的成功していません。メイン プロシージャ内の多数のサブプロシージャは、Vector 'v' を正常に返すために最終的にシンボリック Vector を必要とするようです。

4

2 に答える 2

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);

?

のソースへの URL を自由に指定できますmyProcか?

于 2013-10-03T17:03:18.170 に答える
0

によって返される最初のp[i]Vector 内のエントリは、xearmいわゆるエスケープされたローカルです。pそのため、それらはグローバルVectorのエントリとは異なるアドレスを持っているため、期待どおりに評価できません。

これは次のように回避できます。交換、

v:=f[1];

に、

v:=f[1];
v:=convert(v,`global`);

によって返される最初の結果のa[i]およびは、グローバル名およびにインデックス付けされているように見え、 と同じ問題はありません。b[i]xearmabp[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-04T00:41:56.803 に答える