我使用下面的函数来块对角化反对称矩阵。
function [R, RI , S ] = Matrix_block (A)
[U,D]= schur (A);
E=ordeig(double(D)) ;
[R, S]= ordschur (U,D, abs(E)<1000*eps ) ;
RI=R';
对于真实的反对称矩阵,代码工作得很好,但对于复杂的反对称矩阵,如下所示就失败了:-
a = rand(6); a = a-a'; [r,ri,s] = Matrix_block(a);
b = rand(6)+1i*rand(6); b= b-conj(b)'; [r,ri,s] = Matrix_block(b);
我怎么能纠正我的代码,它的工作也为复杂的矩阵?我想要一个块对角矩阵(以下形式)作为实矩阵和复矩阵的输出。
0 e1 -0.0000 -0.0000 0.0000 -0.0000
-e1 0 0.0000 0.0000 -0.0000 0.0000
0 0 -0.0000 e2 0.0000 -0.0000
0 0 -e2 -0.0000 0.0000 -0.0000
0 0 0 0 -0.0000 e3
0 0 0 0 -e3 -0.0000
对于复杂情况,您需要使用不同的算法。Matlab文档说:
如果A是复数,则schur返回矩阵t中的复schur形式,复schur形式是A的特征值在对角线上的上三角形。
另外,我注意到您将矩阵D
转换为double(D)
。这没有实际效果,因为D
已经是两倍了。尽管如此,我已经看到,ordeig
返回不同的值的特征值取决于你是否输入D
或double(D)
,甚至为实际情况。