mat☆☆



Full BASICには行列(matrix)演算を行うmat文がある。

MAT A = B
      左辺の配列に右辺の配列の値を代入する。
      次元が変わるような代入はできない。
MAT A = ZER
   左辺の配列の各要素に0を代入する。
MAT A = ZER(数値式)                    Aが1次元のとき
MAT A = ZER(数値式 ,数値式)            Aが2次元のとき
MAT A = ZER(数値式 ,数値式 ,数値式)    Aが3次元のとき
    配列Aの添字の上限を変更し,全要素を0にする。
    配列の大きさを動的に変更したいときに用いる。
    次元を変えることはできない。
MAT A = CON
   全要素に1を代入する。
MAT A = CON(数値式)
MAT A = CON(数値式 ,数値式)
MAT A = CON(数値式 ,数値式 ,数値式)
    配列Aの添字の上限を変更し,全要素を1にする。
MAT A=B+C
MAT A=B-C
MAT A=B*C
   行列B,Cの和,差,積をAに代入する。
   積の場合,A,B,Cの次元の組合せは 1-2-1, 1-1-2, 2-2-2 のいずれか。
MAT A=(数値式)*B
    スカラー倍。
    数値式が定数,関数引用,変数名のいずれかであれば前後の括弧は不要。
    例  (xは数値変数とする)
       MAT A=x*A
       MAT A=(2*x)*B    
       MAT A=ABS(x+3)*B 
MAT A=(数値式)*CON
    配列の全要素に数値式の値が代入される。

  以下,A,Bは2次元の配列とする。
MAT A = IDN
    単位行列を代入する。
    左辺の配列が正方行列でないと実行時エラーになる。
MAT A = IDN(n)
    n×nの単位行列を代入する。
MAT A=INV(B)
    Bの逆行列をAに代入する。
MAT A=TRN(B)
    Bの転置行列をAに代入する。

<Note> MAT文の実行によって配列の大きさは変化するが,添字の下限は変化しない。添字の上限は新しい大きさに合わせて調整される。 例 A(1)=1,A(2)=2,A(3)=3 である配列Aを添字の下限が0の配列Bに代入すると,B(0)=1,B(1)=2,B(2)=3になる。

<Note> MAT文を実行すると配列の要素数がその配列を最初に宣言したときの要素数より多くなってしまう場合はextye=5001の例外状態(実行時エラー)になる。

<Note> MAT A=ZER(m TO n)を実行してもAの添字の下限はmにならない。 この文は,Aの大きさを n-m+1 に変更する効果しか持たない。 添字の下限を変えたいときは,MAT READ文か,拡張機能のMAT REDIM文を用いる。

外積(独自拡張)
A,B,Cを1次元数値配列とする。
MAT A=CROSS(B,C)
  B,Cの外積(ベクトル積)をAに代入する。
 B,Cの要素数が3でないとき,extype6001の例外となる。

行列の計算式(独自拡張)
Aを1次元,または2次元の数値配列とするとき,次の形のMAT文を書くことができる。
MAT A=行列の計算式
MAT TRN(A)=行列の計算式
等号の左辺を TRN(A)とすると,計算結果の転置行列をAに代入する。
行列の計算式には,INV関数,TRN関数,CNJ関数を用いることができる。
1次元配列にTRN関数を適用すると,2次元配列(縦ベクトル)になる。
CNJ関数は,複素数モードで用いたとき,配列の全要素を共役複素数に変える。
行列のべき乗は,正方行列の整数べきに限る。指数に小数を指定すると,整数に丸められる。
行列の積の先頭にスカラー積を指定できる。スカラー積を指定するのは積の先頭に限る。
行列の加減算は,通常の数式と異なり,先頭に正号,負号を書くことができない。
計算式を( )で括って計算順序を変えることができる。
行数が1の2次元配列と1次元配列は相互に代入できる。ただし,次元は変化しない。
2次元配列と1次元配列の積は MAT A=B*C の形式(JIS規格の範囲内)でのみ書ける。
DET関数にも,この形の計算式を指定できる。
即席ベクトル(独自拡張)
MAT文で等号の左辺に,数値変数をコンマで区切って並べ,[ ]で括ったものを書いて1次元配列として機能させることができる。
行列の計算式の中に,数値式をコンマで区切って並べ,[ ]で括ったものを書いて1次元配列として機能させることができる。
例 Aを DIM A(3,3)で宣言された2次元配列とするとき,
MAT [x,y,z]=[1,2,3]*A
MAT TRN([x,y,z])=A*TRN([1,2,3])
行,または,列の抽出(独自拡張)
Aを2次元数値配列(計算式は不可),m,nを数値式とする。
行列の計算式で以下の関数を用いることができる。
ROW(A,n)        Aの第n行を抽出した1次元配列
COLUMN(A,n)      Aの第n列を抽出した1次元配列
ROW(A,m:n)       Aの第m行から第n行までを抽出した2次元配列
COLUMN(A,m:n)    Aの第m列から第n列までを抽出した2次元配列
注意.
COLUMN(A,n) で得られる1次元配列は意味的には列ベクトルであるが,文法的は通常の1次元ベクトルと区別されない。
行,または,列への部分代入(独自拡張)
Aを2次元数値配列,m,nを数値式とする。
MAT ROW(A,n)=行列の計算式(1次元)       Aの第n行を右辺の値で置き換える。
MAT COLUMN(A,n) = 行列の計算式(1次元)    Aの第n列を右辺の値で置き換える。
MAT ROW(A,m:n)=行列の計算式(2次元)     Aの第m行から第n行を右辺の値で置き換える。
MAT COLUMN(A,m:n) = 行列の計算式(2次元)   Aの第m行から第n行を右辺の値で置き換える。
行への代入のとき,列数が一致していなければならない。
列への代入のとき,行数が一致していなければならない。
Note .
MAT ROW(A,m:n) でn-m+1が 右辺の計算結果の行数と異なるとき,Aの行数は増減する。
MAT ROW(A,n+1:n)=行列の計算式(2次元)  を実行すると,第n行の直後に右辺の計算結果の行列が挿入される。

Aの行数が増加するMAT文を実行するためには,Aのサイズを大きく宣言しておき,MAT ZER文などで縮小してから使う。
例
DIM A(4,2),B(2,2)
MAT A=ZER(2,2)
MAT ROW(A,3:2)=B

MAT ROW(A,m:n) =B においてBは行数0でもよいので,行削除に使える。このとき,Bの列数はAと一致させておく。
例
DIM A(3,3), B(3,3)
MAT B=ZER(0,3)
MAT ROW(A,2:2)=B
を実行すると,Aの第2行が削除される。

行の交換
次のような副プログラムを用意すると,行の入れ替え(交換)ができる。
DIM A(3,4)
CALL SwapRow(A,2,3)
END
EXTERNAL SUB SwapRow(A(,),i,j)  ! Aのi行とj行を交換する
DIM u(lbound(A,2) to ubound(A,2))
DIM v(lbound(A,2) to ubound(A,2))
MAT u=row(A,i)
MAT v=row(A,j)
MAT row(A,i)=v
MAT row(A,j)=u
END SUB


MAT文全般に関する注意
MAT文の実行によって,配列の次元は変化しないが,添字の上限は変化する。
例
DIM A(1,3), B(3,3)
MAT A=COLUMN(B,2:2)
を実行すると,UBOUND(A,1)=3, UBOUND(A,2)=1になる。
変形指示MAT文
TRANSFORM, SCALE( ), SHIFT( ), ROTATE( ), SHEAR( ) を含む行列の積は変形指示mat文