MATLAB eig devuelve signos invertidos a veces
Estoy tratando de escribir un programa que obtiene una matriz.A
De cualquier tamaño, y la SVD la descompone:
A = U * S * V'
DóndeA
es la matriz en la que entra el usuario,U
Es una matriz ortogonal compuesta por los vectores propios deA * A'
, S
es una matriz diagonal de los valores singulares, yV
Es una matriz ortogonal de los vectores propios deA' * A
.
El problema es: la función MATLABeig
A veces devuelve los vectores propios equivocados.
Este es mi código:
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
Mi código devuelve el correctos
matriz, y también "casi" correctaU
yV
matrices Pero algunas de las columnas se multiplican por -1. obviamente sit
es un vector propio, entonces también-t
es un vector propio, pero con los signos invertidos (para algunas de las columnas, no todas) no entiendoA = U * S * V'
.
¿Hay alguna forma de arreglar esto?
Ejemplo: para la matriz.A=[1,2;3,4]
mi función vuelve:
U=[0.4046,-0.9145;0.9145,0.4046]
y el MATLAB incorporadosvd
función devuelve:
u=[-0.4046,-0.9145;-0.9145,0.4046]