如何将 "Eigen::EigenSolver<MatrixXd> es(Matrix)" 分配给以后可以使用的变量?

How do I assign "Eigen::EigenSolver<MatrixXd> es(Matrix)" to a variable that I can use later?

我能够成功地从 Eigen::EigenSolver 命令中检索特征值和特征向量,但是,我无法将它们分配给新矩阵。我需要将 3 个特征向量分配给一个新的 3x3 矩阵,以便我可以对另一个 3x3 矩阵执行转置然后矩阵乘法。

我不断收到以下错误,绿色胡萝卜指向“{a = b;}”部分中的 "b":

/Eigen/src/Core/functors/AssignmentFunctors.h:24:104:错误:从不兼容的类型 'const std::__1::complex' 分配给 'double' EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a = b; }

我已经尝试将我试图分配给它的新变量声明为 MatrixXd 或 Vector3d,但似乎都不起作用。我认为这个问题与 Eigensolver 将每个元素返回为 (Real, Complex) 有关,我没有正确处理它。如果我只需要计算一次值,这并不是一件坏事。但是,我需要将这些计算放到一个循环中,然后将根据某些条件检查此过程的最终计算,以确定代码中使用的随机值是否会产生有效结果。

[编辑 2020 年 4 月 19 日,上午 1152 点]。我只想在当前计算中使用实部。感谢@stark 在评论中提醒我注意这一点。

如有任何帮助,我们将不胜感激。请记住,我不是训练有素的程序员,我的研究领域是物理和数学,我习惯于使用符号软件和 python。 '''

// Declare matrices for the up and down type quarks
MatrixXd MatrixYukawaUpQuark(3,3), MatrixYukawaDownQuark(3,3);

// Declare vectors for Up and Down Quark eigenvectors
Vector3d UpQVect, DownQVect;

Eigen::EigenSolver<MatrixXd> es1(MatrixYukawaUpQuark);
UpQVect = es1.eigenvectors(); // THE ERROR COMES FROM HERE, AND IF THIS IS COMMENTED OUT THE CODE WORKS FINE IN GENERATING THE EIGENVECTORS & VALUES IN THE PRINT STATEMENTS 

// Printing the Up Quark Matrice values for the Eigenvectors, and Eigenvalues to the screen
std::cout << "\nThe eigenvalues for the Yukawa Up Quark Matrix are: " << std::endl << es1.eigenvalues() << std::endl;
std::cout << "\nThe Up Quark eigenvectors are:" << std::endl << es1.eigenvectors() << std::endl;

Eigen::EigenSolver<MatrixXd> es2(MatrixYukawaDownQuark);
//DownQVect = es2.eigenvectors(); // THIS WILL ALSO PRODUCE AN ERROR AS IT IS THE SAME PROBLEM FROM ABOVE

// Printing the Up Quark Matrice values for the Eigenvectors, and Eigenvalues to the screen
std::cout << "\nThe eigenvalues of the Yukawa Down Quark Matrix are: " << std::endl << es2.eigenvalues() << std::endl;
std::cout << "\nThe Down Quark eigenvectors, V, is:" << std::endl << es2.eigenvectors() << std::endl;

'''

下面是您在上面看到的打印语句:

汤川上夸克矩阵的特征值为:
(-1.00393,0)
(1.01004,0)
(1.00393,0)

上夸克特征向量是: (-0.707819,0) (0.57735,0) (-0.407013,0)
(0.706393,0) (0.57735,0) (-0.409483,0)
(0.00142613,0) (0.57735,0) (0.816495,0)

汤川下夸克矩阵的特征值为:
(-1.96316,0)
(2.07543,0)
(1.96316,0)

下夸克特征向量 V 是:
(-0.713131,0) (0.57735,0) (-0.397632,0)
(0.700925,0) (0.57735,0) (-0.418773,0)
(0.0122058,0) (0.57735,0) (0.816405,0)

您正在尝试将 3x3 复数矩阵分配给 3x1 实数向量。将 UpQVect 的类型更改为 Matrix3cd 应该可以编译您的代码:

Matrix3cd UpQVect = es1.eigenvectors();

如果要提取实部存储到3x3矩阵中,可以这样写:

Matrix3d UpQVect = es1.eigenvectors().real();

另请注意,多次访问 es1.eigenvectors() 基本上是免费的。昂贵的计算仅在您构造 es1 时发生(或者如果您稍后调用 es1.compute(newInput);.

但是 你的矩阵似乎是自伴矩阵(至少你的特征向量矩阵是酉矩阵),所以你可能更喜欢使用 SelfAdjointEigenSolver。如果你的矩阵在编译时也恰好已知大小为 3x3,你甚至可以编写更有效的:

Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> es1;
es1.computeDirect(MatrixYukawaUpQuark);