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)

猜你喜欢

转载自blog.csdn.net/weixin_42107106/article/details/82839754