複数データの型

 

系列、リスト、集合、配列(MATLABのセルに相当?)、実数配列、行列、表、文字列があります。型はtypeで調べます。配列と数値配列では要素の順番の定義が必要です。配列・数値配列・行列では一旦リストを作成後にarray,hfarray,matrix関数で定義します。構造体の作成方法は?です。尚コメント文は//の後に続けます。

a:=1,2,3,4:(a,type(a));//系列
b:=(1,2,3,4):(b,type(b));//系列
c:=[1,2,3,4]:(c,type(c));//リスト
d:={1,2,3,4}:(d,type(d));//集合
e:=array(1..2,1..2,[[1,2],[3,4]]):(e,type(e));//配列
f:=hfarray(1..2,1..2,[[1,2],[3,4]]):(f,type(f));//実数配列
g:=matrix([[1,2],[3,4]]):(g,type(g));//行列
h:=table(a[1,1]=1,a[1,2]=2,a[1,3]=3,a[1,4]=4):(h,type(h));//表
i:="Hallo World":(i,type(i));

1, 2, 3, 4, "_exprseq"
1, 2, 3, 4, "_exprseq"
[1, 2, 3, 4], DOM_LIST
{1, 2, 3, 4}, DOM_SET
array(1..2, 1..2, (1,1) = 1, (1,2) = 2, (2,1) = 3, (2,2) = 4), DOM_ARRAY
hfarray(1..2, 1..2, [1.0, 2.0, 3.0, 4.0]), DOM_HFARRAY
matrix([[1, 2], [3, 4]]), Dom::Matrix()
table(a[1, 4] = 4, a[1, 3] = 3, a[1, 2] = 2, a[1, 1] = 1), DOM_TABLE
"Hallo World", DOM_STRING

中身を表示させます。表の中身を表示させる方法は?です。
順番は1,2,3...ですが、配列と数値配列では定義によって異なります。

配列・数値配列と表以外は..を使えば連続して要素の抽出ができます。

a[1..2];b[1..2];c[1..2];d[1..2];
e[1,1];f[1,1];g[1..2,1];h[1];i[1..2];
delete a,b,c,d,e,f,g,h,i;
a:=array(-3..3,[1,2,3,4,5,6,7]);//a[-3]~a[3]の定義
a[1];//要注意!
delete a;

1, 2
1, 2
[1, 2]
{1, 2}
1
1.0
matrix([[1], [3]])
h[1]
"Ha"
array(-3..3, (-3) = 1, (-2) = 2, (-1) = 3, (0) = 4, (1) = 5, (2) = 6, (3) = 7)
5

$を使うと連続した要素を作成するのに便利です。

a:=(x $ x=1..5);//系列
b:={a};//集合
c:=[a];//リスト
d:=array(1..5,c);//配列
e:=hfarray(1..5,c);//数値配列
f:=matrix(c);
delete a,b,c,d,e,f;

1, 2, 3, 4, 5
{1, 2, 3, 4, 5}
[1, 2, 3, 4, 5]
array(1..5, (1) = 1, (2) = 2, (3) = 3, (4) = 4, (5) = 5)
hfarray(1..5, [1.0, 2.0, 3.0, 4.0, 5.0])
matrix([[1], [2], [3], [4], [5]])

$を2回使うことでゼロ配列やゼロ行列を作成します。

a:=[[0 $ 3] $ 4];//リスト
b:=array(1..4,1..3,a);//配列
c:=matrix(a);//行列
delete a,b,c;

[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
array(1..4, 1..3, (1,1) = 0, (1,2) = 0, (1,3) = 0, (2,1) = 0, (2,2) = 0, (2,3) = 0, (3,1) = 0, (3,2) = 0, (3,3) = 0, (4,1) = 0, (4,2) = 0, (4,3) = 0)
matrix([[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]])

三次元配列・行列を作成しました。要素の抽出は行列では3次元以降は指定できません。

a:=[[[0 $ 2] $ 3] $ 4];//リスト
b:=array(1..4,1..3,1..2,a);
b[1,1,1];
c:=matrix(a);c[1,1];
delete a,b,c;

[[[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]
array(1..4, 1..3, 1..2,
  (1, 1, 1) = 0,
  (1, 1, 2) = 0,
  (1, 2, 1) = 0,
  (1, 2, 2) = 0,
  (1, 3, 1) = 0,
  (1, 3, 2) = 0,
  (2, 1, 1) = 0,
  (2, 1, 2) = 0,
  (2, 2, 1) = 0,
  (2, 2, 2) = 0,
  (2, 3, 1) = 0,
  (2, 3, 2) = 0,
  (3, 1, 1) = 0,
  (3, 1, 2) = 0,
  (3, 2, 1) = 0,
  (3, 2, 2) = 0,
  (3, 3, 1) = 0,
  (3, 3, 2) = 0,
  (4, 1, 1) = 0,
  (4, 1, 2) = 0,
  (4, 2, 1) = 0,
  (4, 2, 2) = 0,
  (4, 3, 1) = 0,
  (4, 3, 2) = 0
)
0
matrix([[[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]

乱数はrandom()を使います。MATLABのように使うにはコツがあります。

a:=random(0..5)://関数を定義したことになる
a:=[[a() $ i=1..3] $ i=1..4];//リスト
a:=array(1..4,1..3,a);//配列
a:=matrix(a);//二次元だと配列⇔行列の変換が簡単です。
delete a;

[[3, 1, 3], [3, 1, 5], [0, 0, 3], [3, 1, 3]]
array(1..4, 1..3, (1,1) = 3, (1,2) = 1, (1,3) = 3, (2,1) = 3, (2,2) = 1, (2,3) = 5, (3,1) = 0, (3,2) = 0, (3,3) = 3, (4,1) = 3, (4,2) = 1, (4,3) = 3)
matrix([[3, 1, 3], [3, 1, 5], [0, 0, 3], [3, 1, 3]])

行列→配列はexpr、行列・配列→リストはopを使います。

x:=random(0..9);//乱数関数を作成
a:=[x() $ i=1..12];//要素数12の乱数リストを作成
b:=matrix(3,4,a);//3×4の行列を作成。
c:=expr(b);//配列に変換。
type(c);
d:=op(b[2,1..4]);//2行目の行列の要素をリストとして抽出

`proc random() ... end`
[0, 6, 0, 5, 5, 6, 6, 6, 2, 7, 1, 4]
matrix([[0, 6, 0, 5], [5, 6, 6, 6], [2, 7, 1, 4]])
array(1..3, 1..4, (1,1) = 0, (1,2) = 6, (1,3) = 0, (1,4) = 5, (2,1) = 5, (2,2) = 6, (2,3) = 6, (2,4) = 6, (3,1) = 2, (3,2) = 7, (3,3) = 1, (3,4) = 4)
DOM_ARRAY
5, 6, 6, 6