【发布时间】:2013-08-11 16:51:13
【问题描述】:
我正在尝试编写一个程序来获取任意大小的矩阵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]
以及内置的 MATLAB svd 函数返回:
u=[-0.4046,-0.9145;-0.9145,0.4046]
【问题讨论】:
-
我弄错了。对不起。我正在删除我的答案
标签: matlab matrix linear-algebra svd eigenvector