Matlab 将矩阵分解为初等矩阵
MATLAB、Maple或Mathematica中是否有这样的软件包?MATLAB中有许多因子分解/分解函数(参见“特征值和奇异值”和“矩阵分解”下的列表),例如,仅举几个例子。Mathematica文档中的页面列出了所有内置矩阵分解函数,如、、等 嗯 我想,所谓“基本”矩阵,你指的只是那些进行行交换、行乘法和行加法等基本运算的矩阵 您可能有兴趣知道这是PLU分解(因式分解)结果的一部分。来自PLU分解的U是高斯消去的结果,而PLU分解只是伪装的GE。PLU分解的P和L对完成GE所需的元素操作进行编码。所有的Maple、Matlab和Mathematica都有一个很好的PLU分解例程。所以你可以得到基本因子 现在让我们假设我们不需要进行任何行交换。给定矩阵M,我们可以得到下三角L和上三角M。位于主对角线下方的L的项是用来构造初等行加法矩阵的值 最后是Maple代码,展示了如何实现这一点。有三组基本矩阵在那里生成。第一组,在表T1中,是由于将M转换为行梯队形式的GE步骤,来自于使用M的PLU分解L的Matlab 将矩阵分解为初等矩阵,matlab,matrix,wolfram-mathematica,matrix-multiplication,maple,Matlab,Matrix,Wolfram Mathematica,Matrix Multiplication,Maple,MATLAB、Maple或Mathematica中是否有这样的软件包?MATLAB中有许多因子分解/分解函数(参见“特征值和奇异值”和“矩阵分解”下的列表),例如,仅举几个例子。Mathematica文档中的页面列出了所有内置矩阵分解函数,如、、等 嗯 我想,所谓“基本”矩阵,你指的只是那些进行行交换、行乘法和行加法等基本运算的矩阵 您可能有兴趣知道这是PLU分解(因式分解)结果的一部分。来自PLU分解的U是高斯消去的结果,而PLU分解只是伪装的GE。PLU分解的P和L对完成GE所需的元素操作进
l1
L。这是完成的下三角。接下来我们将转置u1,M的PLU分解的U,以便处理M的上三角
表T2中的第二组基本行加法矩阵是由于将u1^%T(从M的PLU分解得到的U的转置)转换为行梯队形式的GE步骤。它们是使用u1^%T的PLU分解的L中的l2
项构建的
这只剩下u1^%T的PLU分解的Uu2
。它是一个对角矩阵(如果没有执行行交换)。因此,我们为u2
的每一行构造基本行缩放矩阵
最后,我们可以把它们按正确的顺序排列,然后将它们相乘。请注意,T2矩阵以相反的顺序出现,因为它们必须相乘以形成u1^%T。同样,T3出现在T1和T2集合之间,因为T3构造u2
作为以后的编辑,这里是一个Maple程序。现在它根据排列结果生成行交换矩阵。它不会返回一些不必要的因素,而这些因素恰好就是身份
请注意,这适用于精确矩阵,而不是浮点矩阵(对于这些矩阵,您的里程数可能会有所不同,这取决于如何按大小选择轴以及如何进行比较)
ElemDecomp:=proc(M::矩阵(正方形))
局部p1,u1,i,j,T1,T2,T3,p2,m,n,lu1,lu2,p1,p2;
使用线性文胸;
(m,n):=尺寸(m);
p1,lu1:=LUDecomposition(M,output=[':-NAG']);
对于从1到m-1的i
对于j,从1到i
如果lu1[i+1,j]0,那么
T1[i*j]:=IdentityMatrix(m,compact=false);
T1[i*j][i+1,j]:=lu1[i+1,j];
如果结束;
结束do;结束do;
因为我从1到m做
如果p1[i]i那么
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;
如果结束;
结束do;
u1:=矩阵(lu1,形状=三角形[上]);
p2,lu2:=LUDecomposition(u1^%T,output=[':-NAG']);
对于从1到m-1的i
对于j,从1到i
如果lu2[i+1,j]0,那么
T2[i*j]:=IdentityMatrix(m,compact=false);
T2[i*j][i+1,j]:=lu2[i+1,j];
如果结束;
结束do;结束do;
因为我从1到m做
如果lu2[i,i]1那么
T3[i]:=IdentityMatrix(m,compact=false);
T3[i][i,i]:=lu2[i,i];
如果结束;
结束do;
因为我从1到m做
如果p2[i]i那么
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;
如果结束;
结束do;
`如果`(类型(P1,表格),条目(P1’:-nolist'),NULL),
seq(seq(`if`(赋值为T1[i*j]),T1[i*j],NULL),j=1..i,i=1..m-1),
seq(`if`(赋值(T3[i]),T3[i],NULL),i=1..min(m,n)),
seq(seq(`if`(赋值为T2[i*j]),T2[i*j]^%T,NULL),j=i..1,-1,i=m-1..1,-1),
`如果`(类型(P2,表格),条目(P2’:-nolist'),则为NULL;
结束程序:
A:=线性代数:-随机矩阵(3,生成器=1..4);
ElemDecomp(A);
线性代数:-常模(`.`(%)-A);
别忘了SVD(奇异值分解)!别忘了Cholesky分解!嗯,我确实链接到了。你们真的想让我在这里重打一遍吗=P
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);