まず、いくつかの行列が次のように 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); //零行列
このとき、
のような 行列を入力するには、つぎのように 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:: を先頭にくっつけて
やる必要があります。念のため。