2x2自相邻(埃尔米特)矩阵的对角化

时间:2014-05-30 16:20:09

标签: c++ matrix eigen eigenvector eigenvalue

对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);
}

测试循环将是

...
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);
}

在没有Eigen的情况下编写循环,直接使用Hermitian矩阵的特征值和特征向量的公式以及if-statement来检查off对角线是否为零,是5倍的因子。我没有正确使用Eigen或者这样的开销正常吗?是否存在针对小型自伴矩阵进行优化的其他lib.s?

1 个答案:

答案 0 :(得分:2)

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

ces.computeDirect(X);

但它不可能比您实施分析公式更快。<​​/ p>