1. 程式人生 > >MATLAB--例項3(矩陣)

MATLAB--例項3(矩陣)

%矩陣的加減,數乘,轉置  %矩陣的加法,矩陣與矩陣相加,維度必須相同 %  A=[1 2 3;4 5 6] %  B=[3 5 2;7 4 1] %  C=A+B;  %矩陣與數相加,矩陣的每一個數都相加 %  D=A+1;  %矩陣的減法同加法  %矩陣的數乘就是每一個元素都乘以這個數 %  A=[4 5;2 4] % %  B=2*A; %  %矩陣的轉置,行與列交換 %  B=A'; %對稱矩陣,轉置後的矩陣與原矩陣相同 %  A=[1 2 3;2 3 4;3 4 2] %  B=A';   A=[2,3;4,5];   B=[3,5;2,4];   C=A*B;   D=juzhencheng(A,B)

矩陣乘法函式 (自編)

function  P=juzhencheng(varargin)

if nargin==0;     P=[];     return; elseif nargin==1;     P=varargin{1};     return; end P1=varargin{nargin}; P2=varargin{nargin-1}; for k=nargin:-1:2     P_TEM=cheng(P2,P1);     P1=P_TEM;     if k==2         break;     end     P2=varargin{k-2}; end P=P_TEM;      function P_TEM=cheng(P2,P1)    if size(P2,2)~=size(P1,1)        warning('矩陣維度無法相乘');    end    P_TEM=zeros(size(P2,1),size(P1,2));    for m=1:size(P2,1)        for n=1:size(P1,2)            P_TEM(m,n)=P2(m,:)*P1(:,n);                end    end

%矩陣的除法 %左除  C=A\B,C=inv(A)*B; % A=[1 -3 -2;1 3 1;4 -6 7] % b=[4;3;10] % rref([A,b])%x1=3.2917,x2=0.0417,x3=-0.4167 %相當於inv(A)*b=A\b %.\,點左除:A.\B,就是B相對應元素除以A的元素 %./,點右除:A./B,就是A相對應元素除以B的元素 %右除  C=A/B,C=A*inv(B);

%矩陣的冪 % A=[0.7 0.15 0.1;0.15 0.8 0.3;0.15 0.05 0.6] % x0=[300;350;200]; % %一年後的種群分佈 % x1=A*x0; % %十年,二十年的種群分佈 % x10=A^10*x0 % x20=A^20*x0 % %矩陣的點乘冪 % B=A.^2

%矩陣的特徵值和特徵向量 %函式 eig() %1.a=eig(A),a為特徵值 % A=[3 7 9;-4 -5 1;2 4 4] % a=eig(A) %2.[v,d]=eig(A),v儲存特徵向量,按列儲存,d儲存特徵值 % [v,d]=eig(A) % %3.[v,d]=eig(A,'nobalance'),可以提高求解精度,當A中存在於eps數量級差不多的數的時候 % A=[3 7 9;-4 -5 1;2 4 eps(2)/2] % [v,d]=eig(A,'nobalance')

%向量的範數 %向量的2-範數 V=[1;2;3;6;7] % a1=norm(V) %向量的1-範數 % a2=norm(V,1) % %向量的正無窮範數 % a3=norm(V,inf) % %向量的負無窮範數 % a4=norm(V,-inf)% %矩陣的範數 % %矩陣的2-範數,奇異值最大值 A=[4 5 6;8 5 2;1 3 5] a1=norm(A,2) a11=max(svd(A));%svd就是求矩陣的奇異值 %矩陣的1-範數,列範數,每一列相加的最大值 a2=norm(A,1) a22=sum(A,1) %矩陣的無窮範數,行範數,矩陣的無負無窮範數,即沒有-inf a3=norm(A,inf) a33=sum(A,2) %矩陣的F-範數 a4=norm(A,'fro')%矩陣的所有元素絕對值的平方加起來再開根號

如果矩陣A或者常數項b有微小變化,導致線性方程組Ax=b的解的巨大變化,則稱Ax=b為病態方程組,矩陣A為病態矩陣。

A為非奇異矩陣,稱cond(A)=||A-1||||A||矩陣A的條件數9

%矩陣的條件數 %矩陣的1-條件數 A=[2 3 4;5 6 1;2 3 8] a1=cond(A,1)%求矩陣A的1條件數 L_max=max(sum(abs(A),1)) L1_max=max(sum(abs(inv(A)),1)) a1-L_max*L1_max %矩陣的1-條件數 a2=cond(A,2) a22=cond(A,2) %矩陣的無窮條件數 a3=cond(A,inf) %希爾伯特矩陣,典型的病態矩陣 H3=hilb(3) a4=cond(H3,inf)%a4 = 748.0000

 %矩陣的秩 rank A=[1 2 4;4 2 1;4 9 7] a=rank(A) %求矩陣奇異值演算法 a1=svd(A)%矩陣A的秩是矩陣大於0的奇異值的個數 a2=rank(A,1.7)%1.7是一個公差 %矩陣的跡 trace b=trace(A) b1=sum(diag(A))

廣義矩陣的逆:A不滿秩,若存在矩陣B,使得ABA=A,BAB=B,則B成為A的廣義逆矩陣

%矩陣的規範正交化函式 orth 及施密特正交化函式 A=[1 2 4;8 7 5;9 3 5] B=orth(A) B1=smit(A)

function V=smit(W) for i=1:size(W,2)     w{i}=W(:,i); end V{1}=w{1}; for i=2:size(W,2)%列數     V{i}=w{i};     temp=0;     for j=1:i-1         temp=temp+((V{j}'*w{i})/(V{j}'*V{j}))*V{j};     end     V{i}=V{i}-temp;     V{i}=V{i}/norm(V{i}); end V{1}=V{1}/norm(V{1}); V=cell2mat(V);

%三角分解-高斯消元求Doolittle分解 function [L,A]=Dolittle_G(A) if size(A,1)~=size(A,2),error('請輸入方陣');end for i=1:size(A,1)     if det(A(1:i,1:i))==0         fprintf('第%d階的順式主子式為0,無法進行分解',i);         return;     end end m=size(A,1); L=zeros(m); for i=1:m     L(i,i)=1; end for i=1:m-1     for j=m:-1:i+1         L(j,i)=A(j,i)/A(i,i)         A(j,:)=A(j,:)-L(j,i)*A(i,:)     end end

%三角分解--待定係數求Doolittle分解

function [L,u]=Dolittle_DQ(A) [m,n]=size(A); %這裡省略判斷方陣與主子式 L=zeros(m) u=zeros(m) for k=1:n     L(k,k)=1;     for j=k:n         a=0;         for i=1:k-1             a=a+L(k,i)*u(i,j)         end         u(k,j)=A(k,j)-a;     end     for i=k+1:n         b=0;         for m=1:k-1             b=b+L(i,m)*u(m,k);         end         L(i,k)=(A(i,k)-b)/u(k,k);     end end

%三角分解--LDU分解

function [l,d,u]=LDU(A) [l,u]=Dolittle_DQ(A) d=diag(diag(u)) for i=1:size(A,1)     u(i,:)=u(i,:)/d(i,i); end

%三角分解--cholesky分解

function [G,GT]=cho(A) [L,D,U]=LDU(A) D1=sqrt(D) G=L*D1 GT=D1*U %cholesky分解 chol A=[5 1 2;1 3 2;2 2 4] a_eig=eig(A)%所有特徵值大於0,矩陣對稱且正定 B=chol(A)%上三角矩陣,A=B'*B B1=chol(A,'lower')%下三角矩陣,A=B1*B1'%三角分解函式 lu [l,u]=lu(A) %PA=LU A=[0 1 2;1 3 2;2 2 4] [l,u]=lu(A) [l,u,p]=lu(A)