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関数は未宣言配列を宣言配列に変換するのに使うことができます。
A [i_1, ..., i_n]を評価します。
ここで、Aは配列、i_1, …, i_nは整数です。
これは、最初の引数が関数の代わりに配列だということを除いて、
applyを連想させます。
配列Aに関する情報を返します。 引数Aは、宣言配列、未宣言(ハッシュド)配列、配列関数、または添字付き関数を取り得ます。
宣言配列では、
arrayinfoは、
アトムdeclaredと、次元数、それぞれの次元のサイズを含むリストを返します。
配列の要素は、バインドされたものもそうでないものも、listarrayで返されます。
未宣言配列(ハッシュド配列)では、
arrayinfoは、
アトムhashedと、添字の数、値を持つすべての要素の添字を含むリストを返します。
値は listarrayで返されます。
配列関数では、
arrayinfoは、
アトムhashedと、添字の数、
記憶された関数値がある添字の値すべてを含むリストを返します。
記憶された関数値は、listarrayで返されます。
添字付き関数では、、
arrayinfoは、
returns a list comprising the
アトムhashedと、添字の数、
ラムダ式がある添字の値すべてを含むリストを返します。
ラムダ式は listarrayで返されます。
listarrayも参照してください。
例:
宣言配列に適用されたarrayinfoとlistarray。
(%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]
未宣言(ハッシュド)配列に適用されたarrayinfoとlistarray。
(%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) ]
配列関数に適用されたarrayinfoとlistarray。
(%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
添字付き関数に適用されたarrayinfoとlistarray。
(%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 )]
式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は割り当てられた配列のリストです。
これらは、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]
配列AをBから埋めます。 ここで、Bはリストか配列です。
もし生成時に特定のタイプがAのために宣言されたら、 その同じタイプの要素でだけ埋めることができます; もし違ったタイプの要素をコピーする試みがなされたらエラーです。
もし配列AとBの次元が違ったら、 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))}
配列Aの要素のリストを返します。 引数Aは、宣言配列、未宣言(ハッシュド)配列、配列関数、添字付き関数を取り得ます。
要素は行優先順にリストされます。
すなわち、要素は、最初のインデックスに従って振り分けられ、次に二番目のインデックスに従って、などなど。
インデックス値の振り分け順は、
orderlessが確立する順と同じです。
未宣言配列や、配列関数、添字付き関数では、
要素はarrayinfoが返すインデックス値に対応します。
宣言された一般配列のバインドされていない要素(すなわち、fixnumでもflonumでもない要素)は、 #####として返されます。
宣言されたfixnum配列またはflonum配列のバイドされていない要素は、
それぞれ0または0.0として返されます。
未宣言配列、配列関数、添字付き関数のバインドされていない要素は返されません。
例:
宣言配列に適用されたlistarrayとarrayinfo。
(%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]]
未宣言(ハッシュド)配列に適用されたlistarrayとarrayinfo。
(%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]]
配列関数に適用されたlistarrayとarrayinfo。
(%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]]
添字付き関数に適用されたlistarrayとarrayinfo。
(%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]]
Lisp配列を生成し、返します。
typeは、any, flonum, fixnum, hashed,
functionalを取り得ます。
n個のインデックスがあり、
i番目のインデックスは0からdim_i - 1まで動きます。
make_arrayのarrayに対する利点は、
戻り値が名前を持たないことであり、
一旦、それへのポインタが消えると、それも消えます。
例えば、もし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
配列の次元を変えます。
新しい配列は
行優先順に古いものの配列で埋められます。
もし古い配列が小さすぎるなら、
残りの要素は、
配列のタイプに依って、
false, 0.0または0で埋められます。
配列のタイプは変えられません。
配列と関数に関連づけられた配列を削除し、占められた領域を開放します。 引数は、宣言配列、未宣言(ハッシュド)配列、配列関数、添字付き関数を取り得ます。
remarray (all)は、
グローバルリストarraysの中の項目すべてを削除します。
もしハッシュド配列の中の値を再定義することが望ましいなら、この関数を使うことが必要になるかもしれません。
remarrayは削除された配列のリストを返します。
remarrayはクォートします。
添字付き式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
もしexprが例えばa[i]のように添字された変数なら、trueを返します。
もしtrueなら、配列の2つのタイプだけが認識されます:
a:make_array(any,3,4);を入力してください。
aは、12個の枠を持つ配列を値として持ち、インデックスはゼロベースです
b[x+1]:y^2を実行したら、生成された配列のデフォルト値でハッシュテーブル配列
(bはまだ配列でもリストでも行列でもありません –
もしこれらの1つなら、x+1は、art-q配列やリスト、行列の有効な添字ではないので
、エラーが起こります。)
(キーとしても知られている)インデックスは、任意のオブジェクトを取り得ます。
一度の1つのキーだけを取ります((b[x+1,u]:yはuを無視します。)。
参照は、b[x+1] ==> y^2によってされます。
もちろん、キーは、例えば、
b[[x+1,u]]:yが有効なように
リストを取り得ます。
これは古いMaximaハッシュ配列と非互換ですが、コンシングを保ちます。
配列をシンボルの値として記憶することの利点は、
関数のローカル変数についての普通の慣例が配列にも適用することです。
ハッシュテーブルタイプは、
Maximaハッシャの古いタイプよりも
少ないコンシングを使い、もっと効率的です。
翻訳され、コンパイルされたコードに関する一貫した振る舞いを得るためには、
translate_fast_arraysをtrueに設定してください。