我想从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来更改它以获得相同/非常相似的效果?
答案 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);
}