我正在尝试编写一个程序来获取A
任意大小的矩阵,然后 SVD 将其分解:
A = U * S * V'
其中A
是用户输入的矩阵,U
是由 的特征向量组成的正交矩阵A * A'
,S
是奇异值的对角矩阵,V
是 的特征向量的正交矩阵A' * A
。
问题是:MATLAB 函数eig
有时会返回错误的特征向量。
这是我的代码:
function [U,S,V]=badsvd(A)
W=A*A';
[U,S]=eig(W);
max=0;
for i=1:size(W,1) %%sort
for j=i:size(W,1)
if(S(j,j)>max)
max=S(j,j);
temp_index=j;
end
end
max=0;
temp=S(temp_index,temp_index);
S(temp_index,temp_index)=S(i,i);
S(i,i)=temp;
temp=U(:,temp_index);
U(:,temp_index)=U(:,i);
U(:,i)=temp;
end
W=A'*A;
[V,s]=eig(W);
max=0;
for i=1:size(W,1) %%sort
for j=i:size(W,1)
if(s(j,j)>max)
max=s(j,j);
temp_index=j;
end
end
max=0;
temp=s(temp_index,temp_index);
s(temp_index,temp_index)=s(i,i);
s(i,i)=temp;
temp=V(:,temp_index);
V(:,temp_index)=V(:,i);
V(:,i)=temp;
end
s=sqrt(s);
end
我的代码返回正确的s
矩阵,以及“几乎”正确U
的V
矩阵。但是有些列乘以-1。显然,如果t
是一个特征向量,那么也是-t
一个特征向量,但是符号倒置(对于某些列,不是全部)我不明白A = U * S * V'
。
有没有什么办法解决这一问题?
示例:对于矩阵,A=[1,2;3,4]
我的函数返回:
U=[0.4046,-0.9145;0.9145,0.4046]
并且内置的 MATLABsvd
函数返回:
u=[-0.4046,-0.9145;-0.9145,0.4046]