Own Library - OwnSolver中的复数值

Eigen Library - complex values in EigenSolver

我想从 Matlab 重写为 C++ eig 函数:

[V,D] = eig(A,B) produces a diagonal matrix D of generalized
eigenvalues and a full matrix V whose columns are the corresponding
eigenvectors so that A*V = B*V*D.

我得到了 Matrix4d 的积极结果 class:

pair<Matrix4d, Vector4d> eig(const Matrix4d& A, const Matrix4d& B)
{
const Eigen::GeneralizedSelfAdjointEigenSolver<Matrix4d> solver(A, B);

const Matrix4d V = solver.eigenvectors();
const Vector4d D = solver.eigenvalues();

return pair<Matrix4d, Vector4d>(V, D);
}

我现在面临的问题是 Matlab 中的 eig 能够使用复数——这是我的算法所需要的。

如何更改它以接收 same/very 与使用 Matrix4cd class 而不是 Matrix4d 类似的效果?

MatrixXd替换为它的复杂版本,Matrix4cd(实际上是Matrix< std::complex < double >, Dynamic, 4 >的快捷方式,参见here):

std::pair<Matrix4cd, Vector4d> eig(const Matrix4cd& A, const Matrix4cd& B)
{
    Eigen::GeneralizedSelfAdjointEigenSolver<Matrix4cd> solver(A, B);

    Matrix4cd V = solver.eigenvectors();
    Vector4d D = solver.eigenvalues();

    return std::make_pair(V, D);
}

已经是这样了。但是请注意,您不能传递任意矩阵,但矩阵 A 需要自伴(也称为 hermitian)并且 B 需要正定。


编辑:感谢@AviGinsburg 的评论,我更正了特征值是 real 的错误(因此应该被映射到一个真正的特征向量)。这是一个解决这个问题的 C++14 实现(因此支持我的愚蠢 ;-) ):

auto eig(const Matrix4cd& A, const Matrix4cd& B)
{
    Eigen::GeneralizedSelfAdjointEigenSolver<Matrix4cd> solver(A, B);

    auto V = solver.eigenvectors();
    auto D = solver.eigenvalues();

    return std::make_pair(V, D);
}

如果你不t/can不在 davidhigh 的 中使用 auto 试试这个

std::pair<Matrix4cd, Vector4d> eig(const Matrix4cd& A, const Matrix4cd& B)
{
    Eigen::GeneralizedSelfAdjointEigenSolver<Matrix4cd> solver(A, B);

    Matrix4cd V = solver.eigenvectors();
    Vector4d D = solver.eigenvalues();

    return std::make_pair(V, D);
}