Как бы я переставил действительные части диагональной матрицы вместе с соответствующими собственными векторами в другой матрице? - PullRequest
1 голос
/ 01 декабря 2019

Я работаю над проблемами MATLAB из моего учебника, и одна из проблем просит меня использовать команду eig в MATLAB, вычислить матрицы V и D так, чтобы A = V * D * inv(V). Зная, что первый столбец V соответствует первому собственному значению D(1,1) и т. Д., Мне нужно изменить порядок диагональных элементов в D, чтобы действительная часть увеличивалась по диагонали, и изменить порядок столбцов Vсоответственно, так что A = V * D * inv(V) все еще сохраняется. Вот что я написал до сих пор:

r = RandStream('mt19937ar','Seed',1234);
A = r.randn(10,10)+1j*r.randn(10,10);
[V,D] = eig(A);

for tt = 1:9
    if (real(D(tt,tt)) > real(D(tt+1,tt+1)))
        temp = D(tt,tt);
        D(tt,tt) = D(tt+1,tt+1); 
        D(tt+1,tt+1) = temp;
        tempV = V(1,tt);
        V(1,tt) = V(1,tt+1);
        V(1,tt+1) = tempV;
        if (A == V*D*inv(V))
            break
        end
    end
end

Когда я проверял это, диагональные элементы D не изменились по сравнению с первоначальным порядком, я знаю, что это может быть связано с заданными мною условиями, ноЯ не уверен, что именно заставляет его ничего не делать. Я также думаю, что могут возникнуть проблемы с перестановкой диагональных элементов и соответствующих собственных векторов. Любые отзывы или предложения приветствуются, спасибо заранее.

1 Ответ

0 голосов
/ 01 декабря 2019

Ваш код имеет несколько проблем:

  • Вам нужны два цикла for для сортировки .
  • Вы меняете только первый элемент собственных векторов, используйте V(:, tt) для всего столбца.
  • V*D*inv(V) никогда не будет точно равен A (см. this ).

Чтобы отсортировать собственные значения по их действительным частям, попробуйте следующее:

clc;
r = RandStream('mt19937ar','Seed',1234);
n = 10;
A = r.randn(n)+1j*r.randn(n);
[V,D] = eig(A);
d = diag(D, 0); % get eigenvalues in a vector
[~, I] = sort(real(d)); % get index of eigenvalues after sorting
D2 = diag(d(I)); % get sorted eigenvalues as diagonal matrix
V2 = V(:, I); % reorder eigenvectors to match sorted eigenvalues
any(any(abs(A - V2*D2*inv(V2)) > 1e-14)) % test sorted eigenvalues and eigenvectors
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...