C++ 2x2自邻接(厄米)矩阵的对角化

C++ 2x2自邻接(厄米)矩阵的对角化,c++,matrix,eigen,eigenvector,eigenvalue,C++,Matrix,Eigen,Eigenvector,Eigenvalue,对角化2x2厄米矩阵很简单,它可以解析地完成。然而,当计算超过10^6次的特征值和特征向量时,尽可能高效地计算是很重要的。特别是如果非对角元素可以消失,就不可能对特征向量使用一个公式:if语句是必要的,这当然会减慢代码的速度。因此,我认为使用Eigen,即2x2和3x3矩阵的对角化得到优化,仍然是一个不错的选择: 使用 const std::complex I(0,1.); 内联双块分布(双W) { 返回(-W/2.+rand()*W/rand_MAX); } 测试循环将是 ... SelfA

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

使用

const std::complex I(0,1.);
内联双块分布(双W)
{
返回(-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);
}
。。。
自伴特征解算器>ces;
矩阵,2,2>X;

对于(int i=0;i默认情况下,使用迭代方法。要使用2x2和3x3的分析版本,必须调用函数:

ces.computeDirect(X);

但它不太可能比分析公式的实现更快。

我使用ComputedDirect进行了一些检查,但不幸的是,它没有显著改变计算时间(从2.7秒更改为2.6秒)。更新:手册说“目前只支持在编译时已知大小的3x3矩阵”文档在这一点上是错误的。2x2的封闭形式路径确实存在,但仅适用于实矩阵,而不适用于复杂矩阵,这就是为什么您看不到任何差异。
ces.computeDirect(X);