next up previous
Next: 行列の特定の行や列を取り出す(row,col) Up: 線型代数 Previous: 正方行列の諸量 (det,tr,eigenVaules,eigenVectors)

ブロック区分けされた行列の入力(concatMatrix,stackMatrix)

まず、いくつかの行列が次のように mupad に入力されているとします。

MAT:=Dom::Matrix();
A:=MAT([[0,1,0],[0,0,1],[1,0,0]]); 
E3:=MAT(3,3,i->1,Diagonal);   //単位行列
Z3:=MAT(3,3);                      //零行列

このとき、

$\displaystyle B=\begin{pmatrix}
A &A-E3& 0\\
0 & A & A-E3\\
0 & 0 & A
\end{pmatrix}$

のような $ 9\times 9$ 行列を入力するには、つぎのように concatMatrix および stackMatrix を使うと便利です。

A1:=concatMatrix(A,A-E3,Z3);
A2:=concatMatrix(Z3,A,A-E3);
A3:=concatMatrix(Z3,Z3,A);
B:=stackMatrix(A1,A2,A3);

例えば A1は次のような行列になります。

                    +-                              -+
                    |  0, 1, 0, -1,  1,  0, 0, 0, 0  |
                    |                                |
                    |  0, 0, 1,  0, -1,  1, 0, 0, 0  |
                    |                                |
                    |  1, 0, 0,  1,  0, -1, 0, 0, 0  |
                    +-                              -+

concatMatrix とstackMatrix を上のように何度も使うのは面倒ですね。 じつは concatMatrix は "." (ピリオド記号)で代用できます。

A1:=A.(A-E3).Z3

この便法を使うと、次のようにお手軽にブロック区分けをされた行列を 入力できます。

B:=stackMatrix(      
A  . (A-E3) .  Z3    ,          
Z3 .  A     . (A-E3) ,          
Z3 .  Z3    .  A
);
(このように改行をいれて見やすくしておくといいでしょう。)

これらの関数はlinalg パッケージに入っているので、 もしあらかじめ export(linalg)していない場合には (たとえば trace ならば linalg::trace などのように)linalg:: を先頭にくっつけて やる必要があります。念のため。


2008-11-15