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]

Respuestas a la pregunta(1)

Su respuesta a la pregunta