これを行うMATLAB、Maple、またはMathematicaのパッケージはありますか?
3 に答える
「基本的な」行列とは、行の交換、行の乗算、行の追加の基本的な操作を行うものだけを意味していると思います。
これが PLU 分解 (因数分解) の結果の一部であることに興味があるかもしれません。PLU 分解から得られる U はガウス消去法の結果であり、その PLU 分解は単なる GE に変装したものです。また、PLU 分解の P と L は、GE を達成するために必要な基本操作をエンコードします。また、Maple、Matlab、および Mathematica のすべてに優れた PLU 分解ルーチンがあります。したがって、素因数を取得できます。
今のところ、行のスワップを行う必要はないと仮定しましょう。したがって、行列 M が与えられると、下三角 L と上三角 M を取得できます。主対角線の下にある L のエントリは、基本行加算行列を構築するための値です。
最後に、それを行う方法を示す Maple コードがあります。そこで生成される基本行列の 3 つのセットがあります。テーブル T1 の最初のセットは、M を行エシュロン形式にする GE ステップによるもので、Ml1
の PLU 分解の L を使用することから得られます。これで下三角が完成しました。次に、M の上三角を扱うために、M の PLU 分解の U である u1 を転置します。
テーブル T2 の 2 番目の基本行加算行列のセットは、u1^%T (M の PLU 分解からの U の転置) を行階層形式にする GE ステップによるものです。l2
これらは、u1^%T の PLU 分解の L のエントリを使用して構築されます。
u2
それは、u1^%T の PLU 分解の U を残すだけです。これは対角行列です (行スワップが実行されていない場合)。したがって、 の各行に対して基本行スケーリング行列を作成しu2
ます。
最後に、すべてを正しい順序に並べて、それらを掛け合わせることができます。T2 行列は、u1^%T を形成するために一緒に乗算する必要があるため、転置された逆の順序で表示されることに注意してください。同様に、T3 は T1 セットと T2 セットの間に表示されu2
ます。
あとの編集として、ここでは Maple の手順として。これで、順列の結果から行スワップ マトリックスが生成されます。そして、たまたまアイデンティティであるいくつかの不必要な要素を返しません。
これは、浮動小数点行列ではなく、正確な行列に関するものであることに注意してください (ピボットが大きさによってどのように選択され、比較がどのように行われるかにより、マイレージは異なる場合があります)。
ElemDecomp:=proc(M::Matrix(square))
local p1,u1,i,j,T1,T2,T3,p2,m,n,lu1,lu2,P1,P2;
uses LinearAlgebra;
(m,n):=Dimensions(M);
p1,lu1:=LUDecomposition(M,output=[':-NAG']);
for i from 1 to m-1 do
for j from 1 to i do
if lu1[i+1,j]<>0 then
T1[i*j]:=IdentityMatrix(m,compact=false);
T1[i*j][i+1,j]:=lu1[i+1,j];
end if;
end do; end do;
for i from 1 to m do
if p1[i]<>i then
P1[i]:=IdentityMatrix(m,compact=false);
P1[i][p1[i],i],P1[i][i,p1[i]]:=1,1;
P1[i][p1[i],p1[i]],P1[i][i,i]:=0,0;
end if;
end do;
u1:=Matrix(lu1,shape=triangular[upper]);
p2,lu2:=LUDecomposition(u1^%T,output=[':-NAG']);
for i from 1 to m-1 do
for j from 1 to i do
if lu2[i+1,j]<>0 then
T2[i*j]:=IdentityMatrix(m,compact=false);
T2[i*j][i+1,j]:=lu2[i+1,j];
end if;
end do; end do;
for i from 1 to m do
if lu2[i,i]<>1 then
T3[i]:=IdentityMatrix(m,compact=false);
T3[i][i,i]:=lu2[i,i];
end if;
end do;
for i from 1 to m do
if p2[i]<>i then
P2[i]:=IdentityMatrix(m,compact=false);
P2[i][p2[i],i],P2[i][i,p2[i]]:=1,1;
P2[i][p2[i],p2[i]],P2[i][i,i]:=0,0;
end if;
end do;
`if`(type(P1,table),entries(P1,':-nolist'),NULL),
seq(seq(`if`(assigned(T1[i*j]),T1[i*j],NULL),j=1..i),i=1..m-1),
seq(`if`(assigned(T3[i]),T3[i],NULL),i=1..min(m,n)),
seq(seq(`if`(assigned(T2[i*j]),T2[i*j]^%T,NULL),j=i..1,-1),i=m-1..1,-1),
`if`(type(P2,table),entries(P2,':-nolist'),NULL);
end proc:
A:=LinearAlgebra:-RandomMatrix(3,generator=1..4);
ElemDecomp(A);
LinearAlgebra:-Norm( `.`(%) - A);
MATLAB には多くの因数分解/分解関数があります (ここの「固有値と特異値」および「行列分解」の下のリストを参照)。たとえば、LU 因数分解、直交三角分解、ブロック LDL 因数分解などがあります。 .
Mathematica ドキュメントの行列分解SingularValueDecomposition
ページには、LUDecomposition
、CholeskyDecomposition
、SchurDecomposition
、 などのすべての組み込みの行列分解関数がリストされています。
チッ!