对矩阵进行满秩分解的MATLAB算法

来源:互联网 发布:洗车优惠的软件 编辑:程序博客网 时间:2024/05/16 11:48

算法程序是从网上摘抄过来的,但是我添加了注释

由于MATLAB中只有对矩阵直接分解成行最简形式E(r)D00的函数,不方便直接看出矩阵的满秩分解形式,即A=P*Q中的P和Q矩阵,因此我找了下网上的程序。

说明:程序中对(m*n)矩阵A进行了满秩分解,分解为P*Q,其中P是m*r矩阵,Q是r*n矩阵,r是矩阵A的秩


B=rref(A);%将矩阵A化成行最简形式(rref,Reduced row echelon form),保存在B中[m,n]=size(A);%获取矩阵A的大小:m行n列P0(1:m,:)=0;%生成一个m行1列的列向量,全部值均为0Q0(:,1:n)=0;%生成一个1行n列的行向量,全部值均为0for i=1:m%依次扫描矩阵m行   flag=1;   for j=1:n%依次扫描矩阵n列       if B(i,j)==1%若B(i, j)等于1                  for k=1:i-1%固定j列,扫描此列的第1行到i-1行元素               if B(k,j)~=0%判断是否全为0                   flag=0;%若不全为0,则将flag置为0(说明此列不是单位矩阵的列)                   break;               end           end           for k=i+1:m%固定j列,扫描此列的第i+1行到m行(即最后一行)元素               if B(k,j)~=0%判断是否全为0                   flag=0;%若不全为0,则将flag置为0(说明此列不是单位矩阵的列)                   break;               end           end           if flag==1 %若flag为1(不为0),则说明此列是【矩阵的行最简形式矩阵】的单位矩阵的列               P0=[P0,A(:,j)];%将矩阵A的j列加到P0列向量之后,如P0=[[0;1;2;3;4],[5;6;7;8;9]]               Q0=[Q0;B(i,:)];%将矩阵B的i行加到Q0行向量之后,如Q0=[ 0,1,2,3,4 ; 5,6,7,8,9 ]或Q0=[[0,1,2,3,4];[5,6,7,8,9]]           end       end      end   end[m1,n1]=size(P0);%获取矩阵P0的大小:m1行n1列[m2,n2]=size(Q0);%获取矩阵Q0的大小:m2行n2列P=P0(:,2:n1);%将矩阵P0的第2列到最后一列赋值给矩阵P(因为第一列是列向量初始化列,其全为0)Q=Q0(2:m2,:);%将矩阵Q0的第2行到最后一行赋值给矩阵Q(因为第一行是行向量初始化行,其全为0)


0 0
原创粉丝点击