我将如何重新排列对角矩阵的实部以及另一个矩阵中的对应特征向量?

问题描述 投票:0回答:1

我正在研究教科书中的MATLAB问题,其中一个问题要求我在MATLAB中使用eig命令,计算矩阵VD,使得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的对角线元素没有从原始顺序更改,我知道这可能是由于我设置的条件引起的,但是我不确定是什么原因导致它没有执行任何操作。我也认为我重新排列对角线元素和对应的特征向量的方式可能存在问题。感谢您提供任何反馈或建议,谢谢。

matlab sorting for-loop matrix eigenvalue
1个回答
0
投票

您的代码有多个问题:

  • 您需要为sorting使用两个for循环。
  • 您仅交换特征向量的第一个元素,对整个列使用V(:, tt)
  • [V*D*inv(V)永远不会完全等于A(请参阅this)。

要按特征值对它们的实部进行排序,请尝试以下方法:

clc;
r = RandStream('mt19937ar','Seed',1234);
n = 10;
A = r.randn(n,n)+1j*r.randn(n,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
© www.soinside.com 2019 - 2024. All rights reserved.