Bootstrap

matlab 矩阵运算 矩阵分解

clear;clc;
%1.矩阵中的点乘运算指将两矩阵中相同位置的元素进行相乘运算,将积保存在原位置组成新矩阵
%2.矩阵的范数与条件数
%3.块注释    选中块ctrl+R  与选中块+T
%{    
A=[3 8 9;0 3 3;7 9 5];
B=[8 3 9;2 8 1;3 9 1];
norm(A)                 %范数值
normest(B)              %2-范数值
det(A)                  %行列式值
%}
%4.求矩阵的条件数与范数、逆矩阵
% A=[1 5 -3 4;9 -1 2 1;-2 6 8 5;7 1 0 1];
% cond(A)                 %条件数值
% condest(A)              %范数矩阵条件数值
% norm(A)                 %矩阵的范数值
% inv(A)                  %矩阵求逆
%5.矩阵分解(正定矩阵)
% A=[1 1 1 1;1 2 3 4;1 3 6 10;1 4 10 20]
% R=chol(A)               %对称正定矩阵的分解
% R'*R                    %R'为R的转置

%5.LU分解
% A=[1 2 3 4;5 6 7 8;2 3 4 1;7 8 5 6];
% [L,U]=lu(A)               %不能确定L是下三角矩阵
% [L,U,P]=lu(A)             %能确定L是下三角矩阵
%6.LDM'与LDL'分解    L、M单位下三角,D为对角矩阵

%函数需要用源文件的文件名加上参数
% function [L,D,M]=ldm(A)
% %此函数用来求解矩阵A的LDM'分解
% [m,n]=size(A);                                %获取矩阵的行数和列数
% if m~=n
%     error('输入矩阵不是方阵,请正确输入矩阵!');
%     return;
% end
% D(1,1)=A(1,1);
% for i=1:n
%     L(i,i)=1;
%     M(i,i)=1;
% end
% L(2:n,1)=A(2:n,1)/D(1,1);
% M(2:n,1)=A(1,2:n)'/D(1,1);
% 
% for j=2:n
%     v(1)=A(1,j);
%     for i=2:j
%         v(i)=A(i,j)-L(i,1:i-1)*v(1:i-1)';
%     end
%     for i=1:j-1
%         M(j,i)=v(i)/D(i,i);
%     end
%     D(j,j)=v(j);
%     L(j+1:n,j)=(A(j+1:n,j)-L(j+1:n,1:j-1)*v(1:j-1)')/v(j);
% end
% end

%7.矩阵的LDL'分解
% function [L,D]=ldl(A)
% %此函数用来求解实对称矩阵A的LDL’分解
% %其中L为单位下三角矩阵,D为对角矩阵
% [m,n]=size(A);
% if m~=n || ~isequal(A,A')
%     error('请正确输入矩阵')
%     return;
% end
% D(1,1)=A(1,1);
% for i=1:n
%     L(i,i)=1;
% end
% L(2:n,1)=A(2:n,1)/D(1,1);
% for j=2:n
%     v(1)=A(1,j);
%     for i=1:j-1
%         v(i)=L(j,1:j-1)*v(1:j-1)';
%         D(j,j)=v(j);
%         L(j+1:n,j)=(A(j+1:n,j)-L(j+1:n,1:j-1)*v(1:j-1)')/v(j);

%8.QR分解(正交三角分解,一个正交矩阵Q与一个上三角矩阵R的乘积形式)   正交矩阵,转置等于逆
%随机矩阵的QR分解
%qrdelete的调用格式
% A=rand(4)
% [Q,R]=qr(A);                            %调用格式
% [Q1,R1]=qrdelete(Q,R,2)
% [Q2,R2]=qrdelete(Q,R,2,'col')
% [Q3,R3]=qrdelete(Q,R,2,'row')
% %qrinsert的调用格式
% A=rand(4)
% x=rand(4,1)
% y=rand(1,4)
% [Q,R]=qr(A)
% [Q1,R1]=qrinsert(Q,R,1,x)               %插入一列后的矩阵进行QR分解
% [Q2,R2]=qrinsert(Q,R,1,x,'col') 
% [Q3,R3]=qrinsert(Q,R,1,y,'row')         %插入一行后的矩阵进行QR分解
% %9.SVD分解
% A=rand(4);
% [U,S,V]=svd(A);                           %矩阵的奇异值分解因子U,S,V
% s=svd(A)                                  %奇异值向量s
% [U1,S1,V1]=svd(A,0)                       %若m>n,则只计算出矩阵U的前n列,矩阵S为n*n矩阵
% 
% %10.舒尔分解
% A=[1 2 3;2 3 1;1 3 0];
% [U,T]=schur(A);
% lambda=eig(A)                               %求解矩阵A的特征值

% %复舒尔分解   (对于有负特征值的矩阵)
% %法1
% A=[1 2 3;2 3 1;1 3 0];
%                        
% [U,T]=schur(A,'complex')                      %?矩阵带复数,太强了吧
% %法2
% A=[1 2 3;2 3 1;1 3 0];
% [U,T]=schur(A);
% [U,T]=rsf2csf(U,T)

% %10.海森伯格分解
% A=[-1 2 3 0;0 -2 3 4;1 0 4 5;1 2 9 -3];
% [P,H]=hess(A)

%11.方程组的求解  
%(1) 首先创建方程组系数矩阵 A、b
% A=[2 1 -5 1;1 -3 0 -6;0 2 -1 2;1 4 -7 6]        %创建方程组系数矩阵A,b
% b=[8 9 -5 0]' 
% %(2)判断方程是否有解
% % %方法一   编写函数isexist.m如下
% % function y=isexist(A,b)
% % %该函数用来判断线性方程组Ax=b   解的存在性
% % %若方程组无解则返回0,若有唯一解则返回1,若有无穷多解则返回Inf
% % [m,n]=size(A);
% % [mb,nb]=size(b);
% % if m~=mb
% %     error('输入有误')
% %     return;
% % end
% % r=rank(A);
% % s=rank([A,b]);
% % if r==s && r==n             %系数矩阵的秩等于增广矩阵的秩
% %     y=1;
% % elseif r==s&&r<n
% %     y=inf;
% % else 
% %     y=0;
% % end
% % end
% %方法二
% %求方程组的秩 求增广矩阵的秩  
% r=rank(A);
% B=[A,b];
% s=rank(B);
% %发现  r==s==n=4,该非齐次线性方程组有唯一解

% %利用矩阵的逆求解
% A=[2 1 -5 1;1 -3 0 -6;0 2 -1 2;1 4 -7 6]        %创建方程组系数矩阵A,b
% b=[8 9 -5 0]' 
% x0=pinv(A)*b;                                   %pinv(A) 为伪逆 具体不介绍
% % b0=A*x0                                         %验证解的正确性
%利用矩阵分解求解
%1.LU分解法  先将系数矩阵A进行LU分解,得到LU=PA,然后解Ly=P吧,最后再解Ux=y,得到原方程组的解
% %(1)编写函数solvebyLU.m
% function x=solvebyLU(A,b)
% %该函数利用LU分解法求线性方程组Ax=b的解
% flag=isexist(A,b);                                   %调用前面的isexist函数判断方程组解的情况
% if flag==0
%     disp('该方程组无解');
%     x=[];
%     return;
% else
%     r=rank(A);
%     [m,n]=size(A);
%     [L,U,P]=lu(A);
%     b=P*b;
%         %解Ly=b
%     y(1)=b(1);
%     if m>1
%         for i=2:m
%             y(i)=b(i)-L(i,1:i-1)*y(1:i-1)';
%         end
%     end
%     y=y';
%         %解Ux=y得原方程组的一个特解
%     x0(r)=y(r)/U(r,r);
%     if r>1
%         for i=r-1:-1:1
%             x0(i)=(y(i)-U(i,i+1:r)*x0(i+1:r)')/U(i,i);
%         end
%     end
%     x0=x0';
%     if flag==1    %若方程组有唯一解
%         x=x0;
%         return;
%     else
%         format rat;
%         Z=null(A,'r');
%         [mZ,nZ]=size(Z);
%         x0(r+1:n)=0;
%         for i=1:nZ
%             t=sym(char([107 48+i]));
%             k(i)=t;
%         end
%         x=x0;
%         for i=1:nZ
%             x=x+k(i)*Z(:,i);
%         end
%     end
% end
% end

%2.QR分解法
%利用QR分解法:先将系数矩阵A进行QR分解:A=QR,然后解Qy=b,最后解Rx=y得到原方程组的解
% %(1)编写函数solvebyQR.m
% function x=solvebyQR(A,b)
% %该函数利用QR分解法求线性方程组Ax=b的解
% flag=isexist(A,b);                                   %调用前面的isexist函数判断方程组解的情况
% if flag==0
%     disp('该方程组无解');
%     x=[];
%     return;
% else
%     r=rank(A);
%     [m,n]=size(A);
%     [Q,R]=qr(A);
%     b=Q'*b;
%         %解Rx=b得原方程组的一个特解
%     x0(r)=b(r)/R(r,r);
%     if r>1
%         for i=r-1:-1:1
%             x0(i)=(b(i)-R(i,i+1:r)*x0(i+1:r)')/R(i,i);
%         end
%     end
%     x0=x0';
%     if flag==1    %若方程组有唯一解
%         x=x0;
%         return;
%     else
%         format rat;
%         Z=null(A,'r');
%         [mZ,nZ]=size(Z);
%         x0(r+1:n)=0;
%         for i=1:nZ
%             t=sym(char([107 48+i]));
%             k(i)=t;
%         end
%         x=x0;
%         for i=1:nZ
%             x=x+k(i)*Z(:,i);
%         end
%     end
% end
% end
%3.选择分解法
%通过输入参数来选择用哪种矩阵分解法求解线性方程组
%(1)编写函数solvelineq.m
function x=solvelineq(A,b,flag)
%该函数是矩阵分解法汇总,通过flag的取值来调用不同的矩阵分解
%若flag='LU',则调用LU分解法;
%若flag='QR',则调用QR分解法;
%若flag='CHOL',则调用CHOL分解法
if strcmp(flag,'LU')
    x=solvebyLU(A,b);
elseif strcmp(flag,'QR')
    x=solvebyQR(A,b)
elseif strcmp(flag,'CHOL')
    x=solvebyCHOL(A,b)      %但缺少solvebyCHOL的函数  并且必须是正定矩阵
else
    error('flag的值只能为LU,QR,CHOL');
end









引用的是matlab2018从入门到精通,不理解的可以尝试去搞明白。

;