特征库 - EigenSolver中的复杂值

时间:2015-05-13 05:40:35

标签: c++ matlab eigen

我想从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类的积极结果:

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能够使用复数 - 我的算法需要什么。

如何使用Matrix4cd类而不是Matrix4d来更改它以获得相同/非常相似的效果?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果你不能/不能在davidhigh solution使用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);
}