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