第 2 章 Maxima のデータとその操作
2.8 行列
2.8.3 行列に関連する函数
rmxcharは行列の(右)の括弧として表示する文字を設定します. 左側はlmxcharで指定します.
matrix element変数一族
¶ ³
変数名 初期値 概要
matrix element add +行列の和の演算子を指定
matrix element mult * 行列の成分間の積の演算子を指
定
matrix element transpose false 転置の際に作用させる函数を設
定
µ ´
matrix element addは行列同士の和を計算する際に用いる演算子を設定します.函数名やlambda
式であっても構いません.
matrix element multは行列の成分同士の積を計算する際に用いる演算子を設定します.函数名
やlambda式であっても構いません.
matrix element transposeは上記の大域変数と同様に,転置行列を計算する際に,作用させる函数
やlambda式をを指定します.
行列の成分に函数を作用させる函数
¶ ³
matrixmap(⟨函数⟩,⟨行列⟩)
µ ´
matrixmap函数は,行列⟨m⟩ の各成分に ⟨函数⟩を作用させる函数です.リストに対するmap 函数の行列版です.
(%i11) A:ident(3)*3;
[ 3 0 0 ]
[ ]
(%o11) [ 0 3 0 ]
[ ]
[ 0 0 3 ]
(%i12) matrixmap(lambda([x],cos(x)*exp(-x)),A);
[ - 3 ]
[ %e cos(3) 1 1 ]
[ ]
(%o12) [ - 3 ]
[ 1 %e cos(3) 1 ]
[ ]
[ - 3 ]
[ 1 1 %e cos(3) ]
行や列の取り出しと追加を行う函数
¶ ³
col(⟨行列⟩,⟨i⟩) row(⟨行列⟩,⟨i⟩)
addcol(⟨行列⟩,⟨リスト1⟩,⟨リスト2⟩,· · ·,⟨リストn⟩) addrow(⟨行列⟩,⟨リスト1⟩, ⟨リスト2⟩,· · ·,⟨リストn⟩) copymatrix(⟨行列⟩)
setelmx(⟨x⟩,⟨i⟩,⟨j⟩,⟨行列⟩)
µ ´
col函数とrow函数は,⟨行列⟩に対し,⟨i⟩で指定される列と行を各々行列の形式で返す函数です.
(%i17) m1;
[ x 0 - 3 x 0 0 ]
[ ]
[ 0 x 0 - 3 x 0 ]
[ ]
[ 0 0 x 0 - 3 x ]
(%o17) [ ]
[ y - 3 0 y 0 0 ]
[ ]
[ 0 y - 3 0 y 0 ]
[ ]
[ 0 0 y - 3 0 y ]
(%i18) row(m1,1);
(%o18) [ x 0 - 3 x 0 0 ]
(%i19) col(m1,1);
[ x ]
[ ]
[ 0 ]
[ ]
[ 0 ]
(%o19) [ ]
[ y ]
[ ]
[ 0 ]
[ ]
[ 0 ]
addcol函数は列として,addrow函数は行として,複数の複数のリストや行列を⟨行列⟩に追加し
ます.尚,追加するリストや行列は,行列の大きさに矛盾しないものでなければなりません.
copymatrix函数は⟨行列⟩の複製を行います. この命令は ⟨行列⟩を成分毎に再生成する時だ
けに使います.
setelmx函数は⟨行列⟩の(⟨i⟩,⟨j⟩)成分を⟨x⟩で置換します.
(%i13) A;
[ 4 0 0 0 ]
[ ]
[ 0 4 0 0 ]
(%o13) [ ]
[ 0 0 4 0 ]
[ ]
[ 0 0 0 4 ] (%i14) setelmx(4,2,3,A);
[ 4 0 0 0 ]
[ ]
[ 0 4 4 0 ]
(%o14) [ ]
[ 0 0 4 0 ]
[ ]
[ 0 0 0 4 ]
尚,setelmx函数を使わなくても,行列成分を直接指定して置換える事も可能です. この場合, A[i,j]:x で行列Aの(i,j)成分をxで置換します.但し,この場合の返却値はxになります.
小行列を生成する函数
¶ ³
minor(⟨正方行列⟩,⟨i⟩,⟨j⟩)
submatrix(⟨行1⟩,· · ·,⟨行m⟩,⟨行列⟩,⟨列1⟩,· · ·,⟨列n⟩) submatrix(⟨行1⟩,· · ·,⟨行m⟩,⟨行列⟩)
submatrix(⟨行列⟩,⟨列1⟩,· · ·,⟨列n⟩)
µ ´
minor函数は与えられた⟨正方行列⟩の⟨i⟩,⟨j⟩成分の小行列,つまり,⟨正方行列⟩から⟨i⟩行 と ⟨j⟩列を抜いた行列を返します.
submatrix函数は⟨行i⟩行と⟨列j⟩列が削除された新しい行列を生成します.submatrix函数は
minor函数よりも多くの行と列が削除出来ます.
転置,上三角,共役な行列を計算する函数
¶ ³
transpose(⟨行列⟩) triangularize(⟨行列⟩)
µ ´
transpose函数は⟨行列⟩の転置行列を生成します.
(%i9) A:matrix([1,2,3],[4,3,1]);
[ 1 2 3 ]
(%o9) [ ]
[ 4 3 1 ] (%i10) transpose(A);
[ 1 4 ]
[ ]
(%o10) [ 2 3 ]
[ ]
[ 3 1 ]
triangularize函数は ⟨行列⟩の上三角行列形式を生成します. 尚,行列が正方行列である必要は
ありません.
(%i6) A:matrix([1,2,3,4],[3,4,5,1],[2,3,1,5]);
[ 1 2 3 4 ]
[ ]
(%o6) [ 3 4 5 1 ]
[ ]
[ 2 3 1 5 ] (%i7) triangularize(A);
[ 1 2 3 4 ]
[ ]
(%o7) [ 0 - 2 - 4 - 11 ]
[ ]
[ 0 0 6 - 5 ]
階数と対角和を計算する函数
¶ ³
rank(⟨行列⟩) mattrace(⟨行列⟩)
µ ´
rank函数は⟨行列⟩の階数を求めます.行列の階数は行列から求めた小行列式で,零にならない 小行列式で,最大のものの大きさです. 尚,rankは行列成分の値が非常に零に近い場合には誤った答
mattrace函数は,⟨行列⟩ が正方行列の場合,対角和,即ち,行列の主対角成分の総和を計算しま す.この函数は,ncharpolyで利用されています. ncharpolyはMaximaのcharpolyの代りに使える 函数です.尚,mattrace函数を利用する為には,予めload(”nchrpl”); を実行する必要があります.
(%i14) load(nchrpl)$
(%i15) A:matrix([1,2,3],[4,3,1],[-2,0,-2]);
[ 1 2 3 ]
[ ]
(%o15) [ 4 3 1 ]
[ ]
[ - 2 0 - 2 ] (%i16) mattrace(A);
(%o16) 2
余因子行列の計算に関連する函数
¶ ³
adjoint(⟨正方行列⟩) invert(⟨正方行列⟩)
µ ´
adjoint函数は⟨正方行列⟩の余因子行列を計算します.
invert函数は逆行列を余因子行列を用いた方法で計算します. これはbfloat値成分や浮動小数点
を係数とする多項式を成分とする行列の逆行列をCRE形式に変換せずに計算出来ます.determinant 命令は余因子の計算で利用されるので,ratmxがfalseならば,その逆行列は成分表現を変更せずに 計算されます. 現行の実装は高い次数の行列に対して効率的なものではありません. 尚,大域変数
detoutがtrueの場合,行列式の部分は逆行列の外側に出されたままとなります.
invertが返した結果は展開されていません.最初から多項式成分を持つ行列の場合,
expand(invert(mat)) ,detout; で生成された出力は見栄えが良くなります.
(%i28) A:matrix([t,1,t-2],[1,t,0],[t+1,1,t-1]);
[ t 1 t - 2 ]
[ ]
(%o28) [ 1 t 0 ]
[ ]
[ t + 1 1 t - 1 ] (%i29) adjoint(A);
[ (t - 1) t - 1 - (t - 2) t ]
[ ]
(%o29) [ 1 - t (t - 1) t - (t - 2) (t + 1) t - 2 ]
[ ]
[ 2 ]
[ 1 - t (t + 1) 1 t - 1 ]
(%i30) invert(A),expand,detout;
[ 2 2 ]
[ t - t - 1 2 t - t ]
[ ]
[ 1 - t 2 t - 2 ]
[ ]
[ 2 2 ]
[ - t - t + 1 1 t - 1 ] (%o30)
---2 t - 1
尚,行列式を行列の中に入れる場合, adjoint(⟨行列⟩)/determinant(⟨行列⟩)を計算した結果を
expandで展開したり,有理数係数の多項式が行列の成分に現われる場合は,ratsimpを用いると良
いでしょう.
(%i35) adjoint(A)/determinant(A),expand;
[ 2 2 ]
[ t t 1 2 t t ]
[ --- - --- - --- --- - --- ] [ 2 t - 1 2 t - 1 2 t - 1 2 t - 1 2 t - 1 ]
[ ]
[ 1 t 2 t 2 ]
(%o35) [ --- - --- --- --- - --- ] [ 2 t - 1 2 t - 1 2 t - 1 2 t - 1 2 t - 1 ]
[ ]
[ 2 2 ]
[ t t 1 1 t 1 ]
[ - --- - --- + --- --- --- - --- ] [ 2 t - 1 2 t - 1 2 t - 1 2 t - 1 2 t - 1 2 t - 1 ]
(%i36) adjoint(A)/determinant(A),ratsimp;
[ 2 2 ]
[ t - t 1 t - 2 t ]
[ --- - --- - --- ] [ 2 t - 1 2 t - 1 2 t - 1 ]
[ ]
[ t - 1 2 t - 2 ]
(%o36) [ - --- --- --- ]
[ 2 t - 1 2 t - 1 2 t - 1 ]
[ ]
[ 2 2 ]
[ t + t - 1 1 t - 1 ]
[ - --- --- --- ] [ 2 t - 1 2 t - 1 2 t - 1 ]
行列式を計算する函数
¶ ³
determinant(⟨行列⟩) newdet(⟨行列⟩)
newdet(⟨配列⟩,⟨整数⟩) permanent(⟨行列⟩,⟨整数⟩)
µ ´
determinant函数は,Gaussの消去法と似た方法で ⟨行列⟩の行列式を計算します.計算結果の書
式は大域変数ratmxの設定に依存します.
疎行列の行列式を計算する特別な方法もあり,ratmx:trueとsparse:trueに設定した場合に使え ます.
newdet函数は ⟨行列⟩ や ⟨配列⟩ の行列式を計算します.この際に,Johnson-Gentleman tree minorアルゴリズムを用います. 尚⟨整数⟩を指定した場合,1行から⟨整数⟩行と1列から⟨整数⟩ 列の正方行列を取出し,その行列式を計算します. この整数値が無指定の場合,⟨行列⟩が正方行列 であればそのまま行列式を計算し,⟨行列⟩が正方行列で無ければ, 余分な末尾の行,或いは列を削 除した正方行列の行列式を返します.
(%i23) A;
[ 1 2 3 4 ]
[ ]
(%o23) [ 3 4 5 1 ]
[ ]
[ 2 3 1 5 ] (%i24) newdet(A,3);
(%o24)/R/ 6
permanent函数は,⟨行列⟩のpermanentを計算します. 尚⟨整数⟩を指定した場合,1行から⟨整 数⟩行と1列から⟨整数⟩列の正方行列を取出し,その行列式を計算します. ここで,permanentは 行列式に似ていますが,符号の変化のないものです.
特性多項式の生成に関連する函数
¶ ³
charpoly(⟨行列⟩,⟨変数⟩) ncharpoly(⟨行列⟩,⟨変数⟩)
µ ´
charpoly函数は⟨行列⟩の特性多項式det (<変数>I− ⟨行列⟩)を計算します.
determinant (⟨行列⟩ −diagmatrix (length (⟨行列⟩),⟨変数⟩))と同じ結果を返します.
ncharpoly函数は⟨変数⟩に対する⟨行列⟩の特性多項式を計算します.これはMaximaのcharpoly とは別物です.
ncharpolyでは与えられた行列の羃乗の対角和を計算しますが,対角和は特性多項式の根の羃乗
の総和に等しいものです.これらの諸量から根の対称式の計算が可能ですが,それらは特性多項式 の係数です.charpolyはvar*ident[n]-aの行列式を計算している.そんな訳でncharpolyは優れて いる. 例えば,整数成分の非常に大きな行列の場合は算術的に多項式の計算を避ける為です.予め
load(”nchrpl”);で読込む必要があります.