Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 将矩阵分解为初等矩阵_Matlab_Matrix_Wolfram Mathematica_Matrix Multiplication_Maple - Fatal编程技术网

Matlab 将矩阵分解为初等矩阵

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所需的元素操作进

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的
l1
L。这是完成的下三角。接下来我们将转置u1,M的PLU分解的U,以便处理M的上三角

表T2中的第二组基本行加法矩阵是由于将u1^%T(从M的PLU分解得到的U的转置)转换为行梯队形式的GE步骤。它们是使用u1^%T的PLU分解的L中的
l2
项构建的

这只剩下u1^%T的PLU分解的U
u2
。它是一个对角矩阵(如果没有执行行交换)。因此,我们为
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);