[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15. 配列と表

15.1 配列と表に関する諸定義  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1 配列と表に関する諸定義

変数: ARRAY (name, dim1, dim2, ..., dimk)
k次元の配列を設定する。最大で5次元が使える。i次元の添字は0からdimi迄の整数で ある。配列を宣言する前に利用者が添字された変数を割り当てた場合は未宣言の配列 が設定される。利用者が同様の方法で一つ以上の配列を設定しなければならない場合、 それらをARRAY([リストの名前],dim1,dim2,...,dimk)で全て同時に設定しても良い。 未宣言の配列は細切れの配列(添字が細切れとなる為)として知られ、宣言された配列 よりも一般的である。利用者はその最大サイズを宣言しなくても、より多くの元に値 が細切れに割り当てられるに従い、それらは動的に大きくなる。未宣言配列の添字が 数字である必要は無い。しかしながら、配列が寧ろ疎でない限り、可能ならば未宣言 のままにしておくよりもそれを宣言する方がより効率的である。ARRAY関数は未宣言 の配列を宣言された配列に変換する事にも使える。

 
(* 訳者注:

(C75) array(tama,2,2);
(D75)                                tama
(C76) tama[0,0]:1;
(D76)                                  1
(C77) tama[1,0]:2;
(D77)                                  2
(C78) tama[2,0]:3;
(D78)                                  3
(C79) listarray(tama);
(D79)         [1, #####, #####, 2, #####, #####, 3, #####, #####]

この様に配列では添字は0から開始する。
又、(C94)に示す様に、array命令で宣言した配列は動的に大きさの変更が出来ない。

(C94) tama[1,4]:10;
Array tama has dimensions [2,2], but was called with [1,4]
 -- an error.  Quitting.  To debug this try DEBUGMODE(TRUE);)

これに対し、未定義の配列であれば上の説明の様に動的に大きさの変更が可能である。
更に、arrayinfoの値も変化する。

(C95) mike[2,3]:4;
(D95)                                  4
(C96) listarray(mike);
(D96)                                 [4]
(C97) mike[2,3];
(D97)                                  4
(C98) mike[2,4];
(D98)                              mike
                                       2, 4
(C99) arrayinfo(mike);
(D99)                         [HASHED, 2, [2, 3]]
(C100) arrayinfo(tama);
(D100)                       [DECLARED, 2, [2, 2]]
(C101) mike[3,5]:200;
(D101)                                200
(C102) arrayinfo(mike);
(D102)                    [HASHED, 2, [2, 3], [3, 5]]
(C103) mike[1,0]:0;
(D103)                                 0
(C104) arrayinfo(mike);
(D104)                [HASHED, 2, [1, 0], [2, 3], [3, 5]]

尚、ARRAYで宣言した配列に対し、FILLARRAYは使えないので注意する。
*)

変数: ARRAYAPPLY (array,[sub1, ... ,subk])
APPLYに似ているが、第一の引数は配列で、第二の引数はその配列の添字となり、 返却値は指定した添字に対応する配列の値である。

 
(* 訳者注:

(C17) array(neko,1,1,1,1);
(D17)                                neko
(C18) neko[1,1,1,1]:10;
(D18)                                 10
(C19) neko[0,1,0,1]:-1;
(D19)                                 - 1
(C20) arrayapply(neko,[1,1,1,1]);
(D20)                                 10
(C21) arrayapply(neko,[1,0,1,0]);
(D21)                           neko
                                    1, 0, 1, 0
(C23) arrayapply(neko,[0,1]);
Array neko has dimensions [1,1,1,1], but was called with [0,1]
 -- an error.  Quitting.  To debug this try DEBUGMODE(TRUE);)
(C24) 

この例の様に、第一引数に配列名、第二引数に配列の添字リストを与える。添字リスト
は配列の大きさに適合したものでなければエラーになる。

*)

変数: ARRAYINFO (a)
配列aに関する情報をリストで返す。細切れ(hashed)の配列に対しては"HASHED" (細切れ)、下添字の個数と値を持つ全ての元の下添字からなるリストを返す。 宣言された配列に対しては"DECLARED"、下添字番号、aで呼ばれた時のARRAY関数で 与えられた設定からなるリストを返す。例題はEXAMPLE(ARRAYINFO);を実行せよ。

変数: ARRAYMAKE (name,[i1,i2,...])
name[i1,i2,...]を返す。

 
(* 訳者注:

(C16) arraymake(pochi,[1,2,3,4,5,6,7]);
(D16)                      pochi
                                1, 2, 3, 4, 5, 6, 7

ここではpochiと云う配列が新たに生成されている訳ではない。単に配列として表示
しているだけである。
*)

変数: ARRAYS
デフォルト値:[] - 宣言されたものや未宣言の配列全てのリストを返す。arraysを 用いる関数には:
 
ARRAY、ARRAYAPPLY、ARRAYINFO、ARRAYMAKE、FILLARRAY、LISTARRAYとREARRAY
がある。

 
(* 訳者注:

(C1) arrays; 
(D1)                                  []
(C2) array(tama,1,1);
(D2)                                 tama
(C3) pochi[1,2]:10;
(D3)                                  10
(C4) arrays;
(D4)                             [tama, pochi]
(C5) 

*)

変数: BASHINDICES (expr)
- 各和と積に単一の添字を与える事で式exprを変換する。和や積で作用している時、 CHANGEVARでより大きな精度が与えられる。単一添字の形式はJ<番号>となる。ここで <番号>はGENSUMNUMを参照して決められ、そのGENSUMNUMは利用者が変更可能である。 例えば、GENSUMNUM:0$でそれを再設定する。

変数: FILLARRAY (array,list-or-array)
arrayにlist-or-arrayの値を入れる。arrayが浮動小数点(整数)配列であれば、 list-or-arrayは浮動小数点(整数)のリストか浮動小数点(整数)の配列のどちらかで なければならない。配列の次元が異っていればarrayには行番号順に入れられる。 list-or-arrayに十分な元が無ければ、最後の元にarrayの残りが入れられる。 FILLARRAYはその最初の引数を返す。

 
(* 訳者注:

内部的にはLISPのreplace命令を用いて配列要素の入れ換えを行っている。但し、
実際に動作するのはmake_arrayで生成した配列に対してのみである。
*)

変数: GETCHAR (a, i)
文字列や名前aのi番目の文字を返す。この関数はラベルのリスト操作で便利である。

変数: LISTARRAY (array)
宣言された配列か細切れの配列の元のリストを返す。データの順序は行番号順に なっている。定義されていない要素は####で表現される。

 
(* 訳者注:

行番号順とは最初に行番号0のデータが並び、次に行番号1のデータが続く順番である。

(C117) array(aka,2,1);
(D117)                                aka
(C118) aka[0,0]:1;
(D118)                                 1
(C119) aka[0,1]:-1;
(D119)                                - 1
(C120) aka[1,0]:2;
(D120)                                 2
(C121) aka[1,1]:-2;
(D121)                                - 2
(C122) aka[2,0]:3;
(D122)                                 3
(C123) aka[2,1]:-3;
(D123)                                - 3
(C124) listarray(aka);
(D124)                     [1, - 1, 2, - 2, 3, - 3]
(C125) 
*)

変数: MAKE_ARRAY (type,dim1,dim2,...,dimn)
- 配列を生成する。"type"は'ANY、'FLONUM、'FIXNUM、'HASHED、又は'FUNCTIONALが 使える。これはARRAY命令と似ているが、生成された配列は関数配列オブジェクトに なる点で異る。ARRAYよりも良い点は、引数に配列の名前を持たないので破棄されたり、 やがて破棄されるものに対してポインタとして使える事である。つまり、 Y:MAKE_ARRAY(....);で、Yは領域を取り上げるオブジェクトを指定するが、 Y:FALSEとすれば、Yは最早そのオブジェクトを指定せずに、オブジェクトの方は ゴミ集めで回収されてしまう。注意:"dimi"はARRAY命令のものとここでは異なる。 何故なら、それらは0からi-1、つまり、10"次元"は0から9までの元がある事を意味 するからである。

Y:MAKE_ARRAY('FUNCTIONAL,'F,'HASHED,1)- この場合、MAKE_ARRAYの第二の配列は 関数であり、配列の元の計算の為に呼出すものである。そして、残りの引数は再帰的 にMAKE_ARRAYに渡され、配列関数オブジェクト向けの"メモリ"を生成する。

 
(* 訳者注:

(C10) tama:make_array('hashed,3,3);
(D10)             {Array:  #(NIL NIL $HASHED NIL NIL G1888)}
(C11) Y:MAKE_ARRAY('FUNCTIONAL,'F,'HASHED,1);
(D11) 

{Array:  #(NIL NIL $FUNCTIONAL NOTEXIST $F #(NIL NIL $HASHED NIL NIL G1890))}
(C12) 

尚、make_arrayで生成した配列に関してはrearrayとfillarrayが使える。
*)

変数: REARRAY (array,dim1, ... ,dimk)
配列の次元の大きさを変更する為に用いる。新しい配列に古い配列の元が行番号順で 代入される。古い配列が小さ過ぎる場合には、FALSE,0.0又は0が配列の種類に応じて 残りの元を埋める為に用いられる。配列の種類は変更出来ない。

 
(* 訳者注:
maxima-5.6でarrayで宣言した配列は:adjustable tとして宣言されていない為にREARRAY
が使えない。但し、commac.lispの*arrayを修正すると使える。
*)

変数: REMARRAY (name1, name2, ...)
配列と配列に関連した関数を取り除き、占領されていた保存領域を解放する。 引数nameがALLであれば全ての配列が除去される。細切れの配列で値を再定義したい 場合には、この関数を用いる事が不可欠である。

 
(* 訳者注:

(C1) arrays; 
(D1)                                  []
(C2) array(tama,1,1);
(D2)                                 tama
(C3) pochi[1,2]:10;
(D3)                                  10
(C4) arrays;
(D4)                             [tama, pochi]
(C5) remarray(tama);
(D5)                                [tama]
(C6) arrays;
(D6)                                [pochi]

*)

変数: USE_FAST_ARRAYS
[Lispm上でTRUE] - TRUEであれば、唯二つの種類の配列のみ認識される。 記号値で配列を保管する利点は、関数の局所変数に関する通常の取り決めが配列にも 同様に作用する事である。細切れ表型はmacsymaの古い型のhasharよりも少なくconsを 用い、より効率的である。変換されてコンパイルされたコードで十分な振舞いを得た ければ、TRANSLATE_FAST_ARRAYS[TRUE]をTRUEに設定せよ。

 
(* 訳者注:

consはLISPで二つのリストや原子が与えられると、それらを含む新しいリストを作る
操作である。appendと違うのは、cdrを実行するとconsした元がそのまま戻される点
である。以下にCLISPでcons等の実行例を示しておく。

[1]> (cons '(1 2 3) '(1 2 3))
((1 2 3) 1 2 3)
[2]> (cons '1 '(1 2 3))
(1 1 2 3)
[3]> (cons '(1 2 3) '1)
((1 2 3) . 1)
[4]> (append  '(1 2 3) '1)
(1 2 3 . 1)
[5]> (cdr  (append  '(1 2 3) '1))
(2 3 . 1)
[6]> (cdr  (cons  '(1 2 3) '1))
1
[7]> (cdr  (append  '(1 2 3) '(1)))
(2 3 1)
[8]> (cdr  (cons  '(1 2 3) '(1)))
(1)

*)


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Hiroshi Yokota on September, 16 2002 using texi2html