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从入门到精通,不理解的可以尝试去搞明白。