繁体   English   中英

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

[英]How would I reorder the real parts of a diagonal matrix along with the corresponding eigenvectors in another matrix?

我正在处理教科书上的 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的对角线元素并没有改变原来的顺序,我知道这可能是由于我设置的条件,但我不确定具体是什么导致它什么都不做。 我还认为我重新排序对角线元素和相应特征向量的方式可能存在问题。 感谢您提供任何反馈或建议,在此先感谢您。

您的代码有多个问题:

  • 您需要两个 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM