一个2x2自邻(厄密)矩阵的对角化

Diagonalization of a 2x2 self-adjoined (hermitian) matrix

本文关键字:2x2 自邻 厄密 一个      更新时间:2023-10-16

对角化一个2x2厄米矩阵是简单的,它可以解析地完成。然而,当涉及到计算特征值和特征向量超过10^6次时,重要的是尽可能高效地完成它。特别是如果非对角线元素可以消失,则不可能使用一个公式来表示特征向量:必须使用if语句,这当然会减慢代码的速度。因此,我认为使用Eigen,其中声明2x2和3x3矩阵的对角化是优化的,仍然是一个不错的选择:

使用

const std::complex<double> I ( 0.,1. );
inline double block_distr ( double W )
{
  return (-W/2. + rand() * W/RAND_MAX);
}

test-loop应该是

...
SelfAdjointEigenSolver<Matrix<complex< double >, 2, 2> > ces;
Matrix<complex< double >, 2, 2> X;
for (int i = 0 ; i <iter_MAX; ++i) {
  a00=block_distr(100.);
  a11=block_distr(100.);
  re_a01=block_distr(100.);
  im_a01=block_distr(100.);
  X(0,0)=a00;
  X(1,0)=re_a01-I*im_a01;
  //only the lower triangular part is referenced! X(0,1)=0.; <--- not necessary
  X(1,1)=a11;
  ces.compute(X,ComputeEigenvectors);
}

直接使用厄米矩阵的特征值和特征向量的公式和if语句来检查非对角线是否为零,编写没有特征的循环要快5倍。是我没有正确使用Eigen,还是这样的开销是正常的?还有其他的吗?哪一个对于小的自伴随矩阵是最优的?

默认情况下,使用迭代方法。要使用2x2和3x3的解析版本,您必须调用computeDirect函数:

ces.computeDirect(X);

但是它不可能比解析公式的实现更快。