900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > matlab 矩阵运算 矩阵分解

matlab 矩阵运算 矩阵分解

时间:2020-06-01 20:35:31

相关推荐

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.mfunction 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的函数 并且必须是正定矩阵elseerror('flag的值只能为LU,QR,CHOL');end

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。