zoukankan      html  css  js  c++  java
  • 矩阵的五种分解的matlab实现

    由于这学期修了矩阵分析这门课,课程要求用matlab实现矩阵的5种分解,仅仅是实现了分解,上传到博客存档,万一哪天某位同学就需要了呢。。

    1.矩阵的满秩分解

    • 代码实现
     1 %矩阵的满秩分解
     2 clear
     3 %设输入矩阵为M(P152 例4.1.1 4 A = [1,4,-1,5,6;
     5     2,0,0,0,-14;
     6     -1,2,-4,0,1;
     7     2,6,-5,5,-7]
     8 A1 = rref(A);    %将矩阵A化成行最简形式保存在A1中
     9 [m,n]=size(A);    %获取矩阵A的大小:m行n列
    10 B0= [];%生成一个空向量
    11 C0= [];%生成一个空向量
    12 for i=1:m    %依次扫描矩阵m行
    13    flag=1;
    14    for j=1:n    %依次扫描矩阵n列
    15        if A1(i,j)==1    %若A1(i, j)等于1       
    16            for k=1:i-1        %固定j列,扫描此列的第1行到i-1行元素
    17                if A1(k,j)~=0    %判断是否全为0
    18                    flag=0;    %若不全为0,则将flag置为0(说明此列不是单位矩阵的列)
    19                    break;
    20                end
    21            end
    22            for k=i+1:m        %固定j列,扫描此列的第i+1行到m行(即最后一行)元素
    23                if A1(k,j)~=0    %判断是否全为0
    24                    flag=0;    %若不全为0,则将flag置为0(说明此列不是单位矩阵的列)
    25                    break;
    26                end
    27            end
    28            if flag==1         %若flag为1(不为0),则说明此列是【矩阵的行最简形式矩阵】的单位矩阵的列
    29                B0=[B0,A(:,j)];    %将矩阵A的j列加到B0列向量之后
    30                C0=[C0;A1(i,:)];    %将矩阵A1的i行加到C0行向量之后,
    31            end
    32        end       
    33    end
    34 end
    35 [m1,n1]=size(B0);    %获取矩阵B0的大小:m1行n1列
    36 [m2,n2]=size(C0);    %获取矩阵C0的大小:m2行n2列
    37 B=B0(:,1:n1)        %将矩阵B0的第1列到最后一列赋值给矩阵B
    38 C=C0(1:m2,:)        %将矩阵C0的第1行到最后一行赋值给矩阵C
    39 %验证:BC=A
    40 A_1= B*C

    2.矩阵的正交三角分解

    • 代码实现

    直接调用matlab自带qr()函数即可

    1 %矩阵的正交三角分解
    2 clear;
    3 A = [-3,1,-2;1,1,1;1,-1,0;1,-1,1]
    4 [Q, R] = qr(A) %正交三角分解,Q为酉矩阵,R为正交下三角矩阵
    5 %验证:QR是否为A,以及Q是否为酉矩阵
    6 A_1 = Q * R
    7 Q_1 = Q * conj(Q.')

    3.矩阵的奇异值分解

    • 代码实现
    1 %矩阵的奇异值分解
    2 clear,clc
    3 A = [1,1;0,0;1,1];
    4 [U,S,V] = svd(A) %返回一个与A同大小的对角矩阵S,两个酉矩阵U和V,且满足A= U*S*V~H。
    5                  %若A为m×n阵,则U为m×m阵,V为n×n阵。奇异值在S的对角线上,非负且按降序排列。
    6 
    7 %验证A=USV~H
    8 A = [1,1;0,0;1,1]
    9 A_1 = U*S*conj(V.') 

    4.矩阵的极分解

    • 代码实现
    1 %矩阵的极分解
    2 clear,clc;
    3 A = [2,1,2;0,1,3;1,0,0];
    4 H1 = sqrtm(A*A') %返回矩阵的主要平方根
    5 U1 = inv(H1)*A %求逆
    6 A_1 = H1*U1 
    7 H2 = sqrtm(A)
    8 U2 = A*inv(H2)
    9 A_2 = U2*H2

    5.矩阵的谱分解

    以正规矩阵为例:

    •  代码实现
     1 %矩阵的谱分解
     2 clear,clc
     3 A = [4,6,0;-3,-5,0;-3,-6,1]; %单纯矩阵
     4 %A = [-2i,4,-2;-4,-3i,-3i;2,-2i,-5i]; %正规矩阵
     5 [V,D] = eig(A) %求特征值与特征向量
     6 
     7 %正交归一化
     8 V_C = orth(V) ;%特征向量正交化
     9 V_C_Z = V_C./repmat(sqrt(sum(V_C.^2,1)),size(V_C,1),1); %特征向量列归一化
    10 
    11 A_H = A * conj(A');%求A的共轭转置
    12 if A == A_H | A == -(A_H)  %判断是否是正规矩阵
    13     [m,n] = size(V_C_Z);
    14     G2 = zeros(m,n); 
    15     for i=1:n
    16         G1 = V_C_Z(:,i) * conj(V_C_Z');
    17         G2 = G2 + D(i, i) * G1;
    18     end
    19     G_Z = G2
    20 else  %否则是单纯矩阵
    21     P_1 = (inv(V))';
    22     [m,n] = size(P_1);
    23     G3 = zeros(m,n);
    24     for i=1:n 
    25         G4 = V(:,i) * (P_1(:,i))';
    26         G3 = G3 + D(i,i)* G4;
    27     end 
    28     G_R = G3
    29 end

     PS:满秩分解的参考地址记不住了,这里就不备注了,仅仅出于学习的目的,不喜勿喷。

     

  • 相关阅读:
    软件工程作业03
    PSP0级要求02
    PSP0级要求日志
    软件工程个人作业02
    第三周学习进度
    第二周学习进度
    软件工程个人作业01
    Web网页登录设计
    第一周学习进度
    第三周学习进度条+PSP0过程文档
  • 原文地址:https://www.cnblogs.com/yeshengCqupt/p/10187845.html
Copyright © 2011-2022 走看看