MATLAB eig иногда возвращает перевернутые знаки

Я пытаюсь написать программу, которая получает матрицуA любого размера, и SVD разлагает его:

A = U * S * V'

гдеA это матрица, в которую входит пользователь,U является ортогональной матрицей, составленной из собственных векторовA * A', S является диагональной матрицей особых значений, иV является ортогональной матрицей собственных векторовA' * A.

Проблема в том, что функция MATLABeig иногда возвращает неправильные собственные векторы.

Это мой код:

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]

Ответы на вопрос(1)

Ваш ответ на вопрос