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



我能够成功地从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&aamp;b(const{a=b;}

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

[编辑于2020年4月19日上午11时52分]。我只想在我当前的计算中使用Real部分。感谢@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;

''

以下是您在上面看到的打印报表:

Yukawa Up夸克矩阵的特征值为:
(-1.00393.0(

Up Quark特征向量为:(0.707819,0((0.57735,0((-0.47013,0(
(0.706393,0((0.5735,0(

Yukawa Down夸克矩阵的特征值为:
(-1.96316,0(

向下夸克特征向量V为:
(-0.73131,0((0.57735,0((-0.397632,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);

最新更新