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);
}
我想从 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);
}