第 2 章 Maxima のデータとその操作
2.7 配列
(%o7) [hashed, 2, [0, 3], [1, 2]]
(%i8) arrayinfo(a2);
(%o8) [declared, 1, [9]]
(%i9) arrayinfo(a3);
(%o9) [complete, 1, [5]]
先ず,listarry(a1)で,配列a1に1と10が設定されている事が判ります. arrayinfo(a1)で返却さ
れるhashedが配列a1の型になります.その次に配列の次元があり,最後にデータが設定されてい
る個所が表示されています.
ここで表示されている配列の型を詳しく述べる為に,配列を生成する函数について詳細を説明し ましょう.
配列の生成
¶ ³
make art q(⟨整数⟩)
array(⟨配列名⟩,⟨整数1⟩,· · ·, ⟨整数n⟩) array(⟨配列名⟩,⟨型⟩,· · ·,⟨整数1⟩,⟨整数n⟩)
array([⟨配列名1⟩,· · ·,⟨配列名2⟩],⟨整数1⟩,· · ·,⟨整数n⟩) make array(⟨型⟩,⟨整数1⟩, · · ·,⟨整数n⟩)
make array(functional,⟨函数⟩,⟨型⟩,⟨整数1⟩,· · ·,⟨整数n⟩)
µ ´
make art q函数はLISPのmake-array函数を呼出して配列を生成するだけの函数で,Maximaの 配列を生成する函数の中では最も原始的な配列を生成する函数です.
array函数は引数に配列名と次元を指定し,⟨整数⟩次の配列を生成します.ここで ⟨整数⟩は5
以下の整数でなければなりません. 即ち,array函数で生成可能な配列は5次以下の配列です.例え ば,array(a,2,3,4,5,6)は問題ありませんが,array(b,2,3,4,5,6,7)はエラーになります.
このarray函数は大域変数use fast arraysの影響を受けます.
use fast arrays
¶ ³
変数名 初期値 概要
use fast arrays false 配列の種類を制限
µ ´
先ず,大域変数use fast arraysがtrueの場合,make array函数を用いてany型の配列を生成しま す.尚,make array函数でany型の配列を生成する場合, LISPのmake-array函数がそのまま使わ れて初期値がNILのLISPの配列を生成します. 初期値が設定される事を除くと,make art q函数 で生成される配列との違いはありません.
次に大域変数user fast arraysがデフォルトのfalseであれば,array函数は指定した⟨型⟩を反映 した配列を構成します.ここで設定可能な型には,数値配列の場合,浮動小数点型と整数型配列,そ の他にcomplete型があります.
array函数で指定可能な型
¶ ³
型 引数 概要
flonum [flonum,float] 浮動小数点データ.array-mode属性にfloatを設定 fixnum [fixnum,integer] 整数データ.array-mode属性にfixnumを設定
function function 函数型
complete complete その他
µ ´
⟨型⟩でflonum型が指定された場合,初期値として0.0が設定され, 配列のarray-mode属性に floatが設定されます.
⟨型⟩でfixnum型が指定された場合,初期値として0が設定され, 配列のarray-mode属性に
fixnumが設定されます.
⟨型⟩にfunctionとcompleteが指定された場合と⟨型⟩が無指定の場合,Maxima内部ではNIL が設定されます.このNILをlistarray函数は####で表示します.
(%i1) array(a1,flonum,5);
(%o1) a1
(%i2) listarray(a1);
(%o2) [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
(%i3) array(a2,fixnum,3);
(%o3) a2
(%i4) listarray(a2);
(%o4) [0, 0, 0, 0]
(%i5) array(a3,3);
(%o5) a3
(%i6) listarray(a3);
(%o6) [#####, #####, #####, #####]
この例では最初に配列a1をflonum型のデータ配列として生成し,listarray函数で中身を見ていま す.配列の成分が0.0で初期化されていますね.以降,fixnum型と型の指定を行わずに生成し,listarray 函数を用いて中身を見ています.
make array函数はarray函数よりも複雑な配列が生成可能です. このmake array函数で指定可 能な⟨型⟩にはany型,flonum型, fixnum型,hashed型とfunctional型があります.尚,functional型 の場合は第一引数のみに設定します.
(%i45) make_array(’any,5);
(%o45) {Array: #(NIL NIL NIL NIL NIL)}
(%i46) make_array(’fixnum,5);
(%o46) {Array: #(0 0 0 0 0)}
(%i47) make_array(’flonum,5);
(%i48) make_array(’hashed,5);
(%o48) {Array: #(NIL NIL HASHED NIL NIL G13873)}
(%i49) make_array(functional,’sin,flonum,3);
(%o49) {Array: #(NIL NIL $FUNCTIONAL NOTEXIST %SIN #(0.0 0.0 0.0))}
flonum型とfixnum型を指定した場合,make-array函数を用いた配列のみを生成します.その
為,flonum型の場合は初期値が0.0,fixnum型の場合,初期値が0の配列となります.尚,内部的には LISPの通常の配列となります.
flonum型とfixnum型以外の型を指定した場合,内部的に構造体mgenarray型のデータが生成さ
れます.このデータ型の場合,配列データ本体はmgenarrayのcontentに設定されます.
先ず,any型の場合,LISPのmake-array函数を用いて初期値NILの配列が生成されます.
尚,lis-tarray函数で表示を行うと####で初期値が表示されます.
hashed型とfunctional型に関しては,contentに配列本体が設定される仕様の筈ですが,通常の配 列成分の割当を行うと,配列データが壊れる為,これらの型は事実上使えません.
array函数とmake array函数で生成した配列は大域変数arraysに登録されます. make array函 数で,hashed型とfunctional型を指定した場合,gensym函数で生成したシンボルがこのリストに登 録されます.
配列が登録されるリスト
¶ ³
変数名 初期値 概要
arrays []生成した配列名が登録されるリスト
µ ´
大域変数arraysに登録される配列は,array函数で生成した全ての配列と, make array函数で型
がhashedで生成した配列です.尚,この場合はLISPのgensym函数で生成されたシンボルが表示
されます.
(%i1) array(a1,fixnum,5)$
(%i2) array(a2,flonum,5)$
(%i3) array(a3,5)$
(%i4) make_array(hashed,5)$
(%i5) arrays;
(%o5) [a1, a2, a3, g13158]
但し,listarray函数やarrayinfo函数でこのシンボルは使えません. その為,array函数で生成した 配列名のみが登録されたリストと考えた方が実用上問題がありません.
2.7.2 配列操作に関連する函数
リストや配列の値を配列に割当てる函数
¶ ³
fillarray(⟨配列⟩,⟨リスト⟩) fillarray(⟨配列⟩,⟨配列⟩)
µ ´
第一引数の⟨配列⟩に第二引数に指定した⟨リスト⟩か⟨配列⟩の値を入れます. ⟨配列⟩が浮動 小数点数(整数)配列ならば,第二引数は浮動小数点(整数)のリストか浮動小数点(整数)の配列の どちらかでなければなりません.
第一引数の配列には第二引数の内容が先頭から順番に入れられますが,もしも,第一引数の配列 が第二引数よりも大きければ,第二引数の最後部の元で第一引数の配列の残りの個所を埋めてしま います.
配列から指定したデータを取出す函数
¶ ³
arrayapply(⟨配列⟩,[⟨添字1⟩,· · · ,⟨添字k⟩])
µ ´
arrayapplyは第一引数に⟨配列⟩を取り,その後に配列の添字リストを指定します.返却値は指定
した添字に対応する配列の値です.
配列の大きさを変更する函数
¶ ³
rearray(⟨配列⟩,⟨次元1⟩,· · ·,⟨次元n⟩)
µ ´
rearray函数で配列の大きさの変更を行います.この場合,新しい配列に古い配列の元は番号順に
代入されて行きます.新しい配列が古い配列よりも大きなものであれば,残りは0か0.0の何れかで 埋められます.
配列を削除する函数
¶ ³
remarray(⟨配列1⟩,⟨配列2⟩,· · · ) remarray(all)
µ ´
remarray函数は函数を除去し,占領されていた保存領域を解放します.引数がallであれば全て
の配列を除去します.
ここで,⟨式i⟩の内部表現での先頭にある演算子(主演算子と呼びます)は全て同じもので,map函 数を作用させた結果は⟨函数⟩を作用させた各成分を主演算子で繋げたものとなります.