如何使用 Eigen C++ 进行广义复数 Schur(或 QZ)分解?

计算科学 线性代数 C++ 本征系统 拉帕克 本征
2021-12-29 16:38:53

我想对一对复杂矩阵进行广义舒尔(或 QZ)分解AB.

我找到了以下课程:

class Eigen::GeneralizedEigenSolver<_MatrixType>

但似乎它只适用于实矩阵。有任何想法吗?

1个回答

广义复舒尔分解的数值计算可以通过调用zgges ()LAPACK函数来进行。例如,请参阅NETLIB zgees文档或任何其他 BLAS/LAPACK 库实现的文档。

从技术上讲,Eigen 只是一个非常方便的包装器和算法模板库,还包括一些自定义实现。但是,为了获得最大的 Eigen 性能,建议将其链接到 LAPACK\BLAS 库,例如 Intel MKL。

现在,关于 Eigen 中的 Schur 分解。我没有使用GeneralizedEigenSolver的功能,但根据文档,仅支持实矩阵。以下代码正确编译:

Eigen::GeneralizedEigenSolver<Eigen::MatrixXf> solver;
Eigen::MatrixXf A(4,4),B(4,4);
solver.compute(A,B);

但是,复杂版本会导致编译错误,这几乎可以描述其自身:尚不支持复杂矩阵:

Eigen::GeneralizedEigenSolver<Eigen::MatrixXcd> solver;
Eigen::MatrixXcd A(4,4),B(4,4);
solver.compute(A,B);

Eigen/src/Eigenvalues/GeneralizedEigenSolver.h:367:20: error: no viable conversion from 'CoeffReturnType' (aka 'const std::__1::complex<double>') to 'RealScalar' (aka 'double')

该示例在 Eigen 3.3.4 上进行了测试。所以,我建议你直接使用 LAPACK 函数(你必须有一些 BLAS\LAPACK 库连接到你的代码),而不是现在使用 Eigen 包装器。