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)