Previous: Arrays, Up: Arrays   [Contents][Index]

5.7 Functions and Variables for Arrays

関数: array (name, dim_1, …, dim_n)
関数: array (name, type, dim_1, …, dim_n)
関数: array ([name_1, …, name_m], dim_1, …, dim_n)

n次元の配列を生成します。 nは5以下を取り得ます。 i番目の次元のための添字は0からdim_iまで動く整数です。

array (name, dim_1, ..., dim_n)は 一般的な配列を生成します。

array (name, type, dim_1, ..., dim_n)は 指定されたタイプの要素を持つ配列を生成します。 typeには 制限されたサイズの整数にはfixnumが使え、 また、浮動小数点にはflonumが使えます。

array ([name_1, ..., name_m], dim_1, ..., dim_n) は同じ次元のm個の配列を生成します。

もしユーザーが対応する配列を宣言する前に添字付き変数に割り当てたら、 未宣言配列が生成されます。 (ハッシュコーディングが添字上でされるので)別名ハッシュド配列と知られる未宣言配列は、 宣言配列よりもっと一般的です。 ユーザーは最大サイズを宣言せず、さらなる要素が値に割り当てられる時、ハッシュすることで それらは動的に成長します。 未宣言配列の添字は数である必要すらありません。 しかしながら、 配列がむしろ疎でないなら、 未宣言のまま放っておくより、可能な時に宣言した方がおそらく効率的です。 array関数は未宣言配列を宣言配列に変換するのに使うことができます。

Arrays ·
関数: arrayapply (A, [i_1, … i_n])

A [i_1, ..., i_n]を評価します。 ここで、Aは配列、i_1, …, i_nは整数です。

これは、最初の引数が関数の代わりに配列だということを除いて、 applyを連想させます。

関数: arrayinfo (A)

配列Aに関する情報を返します。 引数Aは、宣言配列、未宣言(ハッシュド)配列、配列関数、または添字付き関数を取り得ます。

宣言配列では、 arrayinfoは、 アトムdeclaredと、次元数、それぞれの次元のサイズを含むリストを返します。 配列の要素は、バインドされたものもそうでないものも、listarrayで返されます。

未宣言配列(ハッシュド配列)では、 arrayinfoは、 アトムhashedと、添字の数、値を持つすべての要素の添字を含むリストを返します。 値は listarrayで返されます。

配列関数では、 arrayinfoは、 アトムhashedと、添字の数、 記憶された関数値がある添字の値すべてを含むリストを返します。 記憶された関数値は、listarrayで返されます。

添字付き関数では、、 arrayinfoは、 returns a list comprising the アトムhashedと、添字の数、 ラムダ式がある添字の値すべてを含むリストを返します。 ラムダ式は listarrayで返されます。

listarrayも参照してください。

例:

宣言配列に適用されたarrayinfolistarray

(%i1) array (aa, 2, 3);
(%o1)                          aa
(%i2) aa [2, 3] : %pi;
(%o2)                          %pi
(%i3) aa [1, 2] : %e;
(%o3)                          %e
(%i4) arrayinfo (aa);
(%o4)                 [declared, 2, [2, 3]]
(%i5) listarray (aa);
(%o5) [#####, #####, #####, #####, #####, #####, %e, #####, 
                                        #####, #####, #####, %pi]

未宣言(ハッシュド)配列に適用されたarrayinfolistarray

(%i1) bb [FOO] : (a + b)^2;
                                   2
(%o1)                       (b + a)
(%i2) bb [BAR] : (c - d)^3;
                                   3
(%o2)                       (c - d)
(%i3) arrayinfo (bb);
(%o3)               [hashed, 1, [BAR], [FOO]]
(%i4) listarray (bb);
                              3         2
(%o4)                 [(c - d) , (b + a) ]

配列関数に適用されたarrayinfolistarray

(%i1) cc [x, y] := y / x;
                                     y
(%o1)                      cc     := -
                             x, y    x
(%i2) cc [u, v];
                                v
(%o2)                           -
                                u
(%i3) cc [4, z];
                                z
(%o3)                           -
                                4
(%i4) arrayinfo (cc);
(%o4)              [hashed, 2, [4, z], [u, v]]
(%i5) listarray (cc);
                              z  v
(%o5)                        [-, -]
                              4  u

添字付き関数に適用されたarrayinfolistarray

(%i1) dd [x] (y) := y ^ x;
                                     x
(%o1)                     dd (y) := y
                            x
(%i2) dd [a + b];
                                    b + a
(%o2)                  lambda([y], y     )
(%i3) dd [v - u];
                                    v - u
(%o3)                  lambda([y], y     )
(%i4) arrayinfo (dd);
(%o4)             [hashed, 1, [b + a], [v - u]]
(%i5) listarray (dd);
                         b + a                v - u
(%o5)      [lambda([y], y     ), lambda([y], y     )]
Arrays ·
関数: arraymake (A, [i_1, …, i_n])

A[i_1, ..., i_n]を返します。 結果は未評価の配列参照です。

arraymakeは、 戻り値は、未評価関数コールの代わりに未評価の配列参照だということを除いて、 funmakeを連想させます。

例:

(%i1) arraymake (A, [1]);
(%o1)                          A
                                1
(%i2) arraymake (A, [k]);
(%o2)                          A
                                k
(%i3) arraymake (A, [i, j, 3]);
(%o3)                       A
                             i, j, 3
(%i4) array (A, fixnum, 10);
(%o4)                           A
(%i5) fillarray (A, makelist (i^2, i, 1, 11));
(%o5)                           A
(%i6) arraymake (A, [5]);
(%o6)                          A
                                5
(%i7) ''%;
(%o7)                          36
(%i8) L : [a, b, c, d, e];
(%o8)                    [a, b, c, d, e]
(%i9) arraymake ('L, [n]);
(%o9)                          L
                                n
(%i10) ''%, n = 3;
(%o10)                          c
(%i11) A2 : make_array (fixnum, 10);
(%o11)          {Array:  #(0 0 0 0 0 0 0 0 0 0)}
(%i12) fillarray (A2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
(%o12)          {Array:  #(1 2 3 4 5 6 7 8 9 10)}
(%i13) arraymake ('A2, [8]);
(%o13)                         A2
                                 8
(%i14) ''%;
(%o14)                          9
システム変数: arrays

デフォルト値: []

arraysは割り当てられた配列のリストです。 これらは、arrayで宣言された配列、 (なにかw配列要素に割り当てられた)陰の定義で構成されたハッシュド配列、 :=defineで定義された配列関数を含みます。 make_arrayで定義された配列は含まれません。

array, arrayapply, arrayinfo, arraymake, fillarray, listarray, rearrayも参照してください。

例:

(%i1) array (aa, 5, 7);
(%o1)                          aa
(%i2) bb [FOO] : (a + b)^2;
                                   2
(%o2)                       (b + a)
(%i3) cc [x] := x/100;
                                   x
(%o3)                      cc  := ---
                             x    100
(%i4) dd : make_array ('any, 7);
(%o4)       {Array:  #(NIL NIL NIL NIL NIL NIL NIL)}
(%i5) arrays;
(%o5)                     [aa, bb, cc]
関数: fillarray (A, B)

配列ABから埋めます。 ここで、Bはリストか配列です。

もし生成時に特定のタイプがAのために宣言されたら、 その同じタイプの要素でだけ埋めることができます; もし違ったタイプの要素をコピーする試みがなされたらエラーです。

もし配列ABの次元が違ったら、 Aは行優先順で埋められます。 もしBの中の要素が十分でないなら、 Aの残りを埋めるのに最後の要素が使われます。 もし多すぎるなら、残りは無視されます。

fillarrayは最初の引数を返します。

例:

9個の要素の配列を生成し、リストから埋めます。

(%i1) array (a1, fixnum, 8);
(%o1)                          a1
(%i2) listarray (a1);
(%o2)              [0, 0, 0, 0, 0, 0, 0, 0, 0]
(%i3) fillarray (a1, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
(%o3)                          a1
(%i4) listarray (a1);
(%o4)              [1, 2, 3, 4, 5, 6, 7, 8, 9]

配列を埋めるのに要素が足らない時、 最後の要素が繰り返されます。 要素が多すぎる時、余分の要素は無視されます。

(%i1) a2 : make_array (fixnum, 8);
(%o1)             {Array:  #(0 0 0 0 0 0 0 0)}
(%i2) fillarray (a2, [1, 2, 3, 4, 5]);
(%o2)             {Array:  #(1 2 3 4 5 5 5 5)}
(%i3) fillarray (a2, [4]);
(%o3)             {Array:  #(4 4 4 4 4 4 4 4)}
(%i4) fillarray (a2, makelist (i, i, 1, 100));
(%o4)             {Array:  #(1 2 3 4 5 6 7 8)}

多次元配列は行優先順に埋められます。

(%i1) a3 : make_array (fixnum, 2, 5);
(%o1)        {Array:  #2A((0 0 0 0 0) (0 0 0 0 0))}
(%i2) fillarray (a3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
(%o2)        {Array:  #2A((1 2 3 4 5) (6 7 8 9 10))}
(%i3) a4 : make_array (fixnum, 5, 2);
(%o3)     {Array:  #2A((0 0) (0 0) (0 0) (0 0) (0 0))}
(%i4) fillarray (a4, a3);
(%o4)     {Array:  #2A((1 2) (3 4) (5 6) (7 8) (9 10))}
Arrays ·
関数: listarray (A)

配列Aの要素のリストを返します。 引数Aは、宣言配列、未宣言(ハッシュド)配列、配列関数、添字付き関数を取り得ます。

要素は行優先順にリストされます。 すなわち、要素は、最初のインデックスに従って振り分けられ、次に二番目のインデックスに従って、などなど。 インデックス値の振り分け順は、 orderlessが確立する順と同じです。

未宣言配列や、配列関数、添字付き関数では、 要素はarrayinfoが返すインデックス値に対応します。

宣言された一般配列のバインドされていない要素(すなわち、fixnumでもflonumでもない要素)は、 #####として返されます。 宣言されたfixnum配列またはflonum配列のバイドされていない要素は、 それぞれ0または0.0として返されます。 未宣言配列、配列関数、添字付き関数のバインドされていない要素は返されません。

例:

宣言配列に適用されたlistarrayarrayinfo

(%i1) array (aa, 2, 3);
(%o1)                          aa
(%i2) aa [2, 3] : %pi;
(%o2)                          %pi
(%i3) aa [1, 2] : %e;
(%o3)                          %e
(%i4) listarray (aa);
(%o4) [#####, #####, #####, #####, #####, #####, %e, #####, 
                                        #####, #####, #####, %pi]
(%i5) arrayinfo (aa);
(%o5)                 [declared, 2, [2, 3]]

未宣言(ハッシュド)配列に適用されたlistarrayarrayinfo

(%i1) bb [FOO] : (a + b)^2;
                                   2
(%o1)                       (b + a)
(%i2) bb [BAR] : (c - d)^3;
                                   3
(%o2)                       (c - d)
(%i3) listarray (bb);
                              3         2
(%o3)                 [(c - d) , (b + a) ]
(%i4) arrayinfo (bb);
(%o4)               [hashed, 1, [BAR], [FOO]]

配列関数に適用されたlistarrayarrayinfo

(%i1) cc [x, y] := y / x;
                                     y
(%o1)                      cc     := -
                             x, y    x
(%i2) cc [u, v];
                                v
(%o2)                           -
                                u
(%i3) cc [4, z];
                                z
(%o3)                           -
                                4
(%i4) listarray (cc);
                              z  v
(%o4)                        [-, -]
                              4  u
(%i5) arrayinfo (cc);
(%o5)              [hashed, 2, [4, z], [u, v]]

添字付き関数に適用されたlistarrayarrayinfo

(%i1) dd [x] (y) := y ^ x;
                                     x
(%o1)                     dd (y) := y
                            x
(%i2) dd [a + b];
                                    b + a
(%o2)                  lambda([y], y     )
(%i3) dd [v - u];
                                    v - u
(%o3)                  lambda([y], y     )
(%i4) listarray (dd);
                         b + a                v - u
(%o4)      [lambda([y], y     ), lambda([y], y     )]
(%i5) arrayinfo (dd);
(%o5)             [hashed, 1, [b + a], [v - u]]
Arrays ·
関数: make_array (type, dim_1, ..., dim_n)

Lisp配列を生成し、返します。 typeは、any, flonum, fixnum, hashed, functionalを取り得ます。 n個のインデックスがあり、 i番目のインデックスは0からdim_i - 1まで動きます。

make_arrayarrayに対する利点は、 戻り値が名前を持たないことであり、 一旦、それへのポインタが消えると、それも消えます。 例えば、もしy: make_array (...)なら、 yは領域を取るオブジェクトを指しますが、 y: falseの後、yはそのオブジェクトをもはや指さないので、 オブジェクトはガーベッジコレクトされることができます。

例:

(%i1) A1 : make_array (fixnum, 10);
(%o1)           {Array:  #(0 0 0 0 0 0 0 0 0 0)}
(%i2) A1 [8] : 1729;
(%o2)                         1729
(%i3) A1;
(%o3)          {Array:  #(0 0 0 0 0 0 0 0 1729 0)}
(%i4) A2 : make_array (flonum, 10);
(%o4) {Array:  #(0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0)}
(%i5) A2 [2] : 2.718281828;
(%o5)                      2.718281828
(%i6) A2;
(%o6) 
     {Array:  #(0.0 0.0 2.718281828 0.0 0.0 0.0 0.0 0.0 0.0 0.0)}
(%i7) A3 : make_array (any, 10);
(%o7) {Array:  #(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)}
(%i8) A3 [4] : x - y - z;
(%o8)                      - z - y + x
(%i9) A3;
(%o9) {Array:  #(NIL NIL NIL NIL ((MPLUS SIMP) $X ((MTIMES SIMP)\
 -1 $Y) ((MTIMES SIMP) -1 $Z))
  NIL NIL NIL NIL NIL)}
(%i10) A4 : make_array (fixnum, 2, 3, 5);
(%o10) {Array:  #3A(((0 0 0 0 0) (0 0 0 0 0) (0 0 0 0 0)) ((0 0 \
0 0 0) (0 0 0 0 0) (0 0 0 0 0)))}
(%i11) fillarray (A4, makelist (i, i, 1, 2*3*5));
(%o11) {Array:  #3A(((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15))
    ((16 17 18 19 20) (21 22 23 24 25) (26 27 28 29 30)))}
(%i12) A4 [0, 2, 1];
(%o12)                         12
Arrays ·
関数: rearray (A, dim_1, ..., dim_n)

配列の次元を変えます。 新しい配列は 行優先順に古いものの配列で埋められます。 もし古い配列が小さすぎるなら、 残りの要素は、 配列のタイプに依って、 false, 0.0または0で埋められます。 配列のタイプは変えられません。

Arrays ·
関数: remarray (A_1, ..., A_n)
関数: remarray (all)

配列と関数に関連づけられた配列を削除し、占められた領域を開放します。 引数は、宣言配列、未宣言(ハッシュド)配列、配列関数、添字付き関数を取り得ます。

remarray (all)は、 グローバルリストarraysの中の項目すべてを削除します。

もしハッシュド配列の中の値を再定義することが望ましいなら、この関数を使うことが必要になるかもしれません。

remarrayは削除された配列のリストを返します。

remarrayはクォートします。

Arrays ·
関数: subvar (x, i)

添字付き式x[i]を評価します。

subvarは引数を評価します。

arraymake (x, [i]は 式x[i]を構成しますが、 それを評価はしません。

例:

(%i1) x : foo $
(%i2) i : 3 $
(%i3) subvar (x, i);
(%o3)                         foo
                                 3
(%i4) foo : [aa, bb, cc, dd, ee]$
(%i5) subvar (x, i);
(%o5)                          cc
(%i6) arraymake (x, [i]);
(%o6)                         foo
                                 3
(%i7) ''%;
(%o7)                          cc
関数: subvarp (expr)

もしexprが例えばa[i]のように添字された変数なら、trueを返します。

オプション変数: use_fast_arrays

もしtrueなら、配列の2つのタイプだけが認識されます:

  1. 整数でインデックスされたいくつかの次元を持つができ、 情報入力としてLispまたはMaximaオブジェクトを保てるart-q配列(Common Lispでのt)。 そんな配列を構成するには、 a:make_array(any,3,4);を入力してください。 aは、12個の枠を持つ配列を値として持ち、インデックスはゼロベースです
  2. もしb[x+1]:y^2を実行したら、生成された配列のデフォルト値でハッシュテーブル配列 (bはまだ配列でもリストでも行列でもありません – もしこれらの1つなら、x+1は、art-q配列やリスト、行列の有効な添字ではないので 、エラーが起こります。) (キーとしても知られている)インデックスは、任意のオブジェクトを取り得ます。 一度の1つのキーだけを取ります((b[x+1,u]:yuを無視します。)。 参照は、b[x+1] ==> y^2によってされます。 もちろん、キーは、例えば、 b[[x+1,u]]:yが有効なように リストを取り得ます。 これは古いMaximaハッシュ配列と非互換ですが、コンシングを保ちます。

配列をシンボルの値として記憶することの利点は、 関数のローカル変数についての普通の慣例が配列にも適用することです。 ハッシュテーブルタイプは、 Maximaハッシャの古いタイプよりも 少ないコンシングを使い、もっと効率的です。 翻訳され、コンパイルされたコードに関する一貫した振る舞いを得るためには、 translate_fast_arraystrueに設定してください。


Previous: Arrays, Up: Arrays   [Contents][Index]