gpt4 book ai didi

c++ - Eigen Library - EigenSolver 中的复数值

转载 作者:行者123 更新时间:2023-11-28 00:16:12 28 4
gpt4 key购买 nike

我想从 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 相同/非常相似的效果?

最佳答案

替换 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 的评论,我纠正了特征值是真实(因此应该映射到真实特征向量)的错误。这是一个解决这个问题的 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);
}

关于c++ - Eigen Library - EigenSolver 中的复数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30206527/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com