《矩阵论引论》田振际——P78-例3.6-矩阵的奇异值分解2

%% 《奇异值分解MATLAB计算程序》
clear
clc
disp('矩阵')
% format rat  %为了便于观察,可以采用分数形式,‘0’的分数形式是‘*’
% 例1
% A=[1 0 0;2 0 0];
% 例2
% A=[1 0;0 1;1 1]
%例3
% A=[1 0 1;0 1 1;1 1 2]
%例4
A=[1 0 1;0 1 1;0 0 0]
A=sym(A,'f');            %定义浮点类型,以分数和根号形式表示
disp('<1> 可以求得,矩阵B=A^H*A,即')
B=A'*A
disp('B的特征值为:')
[X TZZ]=eig(B);
TZZ=eig(B)'
disp('<2> 特征值对应的特征向量依次为:')
X
Q1=[];
Q2=[];
for i=1:length(X)
    if TZZ(i)>0
        Q1=simplify([Q1 X(:,i)/norm(X(:,i))]);
    else
        Q2=simplify([Q2 X(:,i)/norm(X(:,i))]);
    end
end
disp('<3> 特征值大于0的特征向量集合:')
Q1
disp('特征值等于0的特征向量集合:')
Q2
disp('所以:')
Q=[Q1 Q2]
D=diag(sqrt((TZZ(TZZ>0))))
disp('计算')
P1=A*Q1*inv(D)
disp('构造')
%% 查找P1中全为0的行k,P2(k)赋值1,然后单位化,实际上可以给P2的所有元素赋值为1,只是计算变复杂而已。
P2_=zeros(size(P1,1),1);
for k=1:size(P1,1)
    if P1(k,:)==0
        P2_(k,:)=1;
    end
end
if P2_~=0
    P2=P2_/norm(P2_);
else
    P2=P2_;
end
P=[P1 P2]
%% 使DA维数相同(凑0法)
disp('凑D使D与A同维数:')
[H L]=size(A);
[h l]=size(D);
if l<L
    D(:,l+1:L)=0;
end
if h<H
    D(h+1:H,:)=0
end
%% 验证结论
disp('奇异值分解计算结果')
FJ_qy=P*D*Q'
disp('原矩阵A')
A
disp('经对比误差为:')
wucha=max(max(FJ_qy-A))

《矩阵论引论》田振际——P78-例3.6-矩阵的奇异值分解2_第1张图片
《矩阵论引论》田振际——P78-例3.6-矩阵的奇异值分解2_第2张图片
《矩阵论引论》田振际——P78-例3.6-矩阵的奇异值分解2_第3张图片

你可能感兴趣的:(Matlab—矩阵论)