1 问题描述
奇异值分解涉及大量重复性计算,为了提高效率,将计算部分用Matlab实现,具体见代码:
2 程序及算例
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]
disp('可以求得,矩阵B=A^H*A,即')
B=A'*A
disp('B的特征值为:')
[X TZZ]=eig(B);
TZZ=eig(B)'
disp('特征值对应的特征向量依次为:')
X
Q1=[];
Q2=[];
for i=1:length(X)
if TZZ(i)>0
Q1=[Q1 X(:,i)];
else
Q2=[Q2 X(:,i)];
end
end
disp('特征值大于0的特征向量集合:')
Q1
disp('特征值等于0的特征向量集合:')
Q2
disp('所以:')
Q=[Q1 Q2]
D=diag(sqrt((TZZ(TZZ>0))))
P1=A*Q1*inv(D)
disp('构造')
P2=ones(size(P1,1),1);
P=[P1 P2]
[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
FJ_qy=P*D*Q' %奇异值分解
A
format
wucha=max(max(FJ_qy-A))
3.奇异值分解计算过程
矩阵
A =
1 0 1
0 1 1
0 0 0
可以求得,矩阵B=A^H*A,即
B =
1 0 1
0 1 1
1 1 2
B的特征值为:
TZZ =
-0.0000 1.0000 3.0000
特征值对应的特征向量依次为:
X =
0.5774 0.7071 0.4082
0.5774 -0.7071 0.4082
-0.5774 -0.0000 0.8165
特征值大于0的特征向量集合:
Q1 =
0.7071 0.4082
-0.7071 0.4082
-0.0000 0.8165
特征值等于0的特征向量集合:
Q2 =
0.5774
0.5774
-0.5774
所以:
Q =
0.7071 0.4082 0.5774
-0.7071 0.4082 0.5774
-0.0000 0.8165 -0.5774
D =
1.0000 0
0 1.7321
P1 =
0.7071 0.7071
-0.7071 0.7071
0 0
构造
P =
0.7071 0.7071 1.0000
-0.7071 0.7071 1.0000
0 0 1.0000
D =
1.0000 0 0
0 1.7321 0
0 0 0
FJ_qy =
1.0000 0.0000 1.0000
0 1.0000 1.0000
0 0 0
A =
1 0 1
0 1 1
0 0 0
wucha =
4.4409e-16
4 结论
程序科学有效,避免了大量的重复性计算,可以验证手工计算。