提问者:小点点

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


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

在“{a=b;”部分中,我一直得到以下错误,一个绿色胡萝卜指向“b”:

/eigen/src/core/functors/assignmentfunctors.h:24:104:错误:将不兼容类型“const std::__1::complex'EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assigncoeffdstscalar&a,const srcscalar&b const{a=b;}

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

[编辑194 2020年4月,1152AM]。我只希望使用真实的部分为我目前的计算。谢谢你@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夸克矩阵的本征值为:br>(-1.00393,0)br>(1.01004,0)br>(1.00393,0)

Up夸克特征向量为:(-0.707819,0)(0.57735,0)(-0.407013,0)Br>(0.706393,0)(0.57735,0)(-0.409483,0)Br>(0.00142613,0)(0.57735,0)(0.816495,0)

Yukawa下夸克矩阵的本征值为:br>(-1.96316,0)br>(2.07543,0)br>(1.96316,0)

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


共1个答案

匿名用户

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

Matrix3cd UpQVect = es1.eigenvectors();

如果你想提取实部并存储到一个3x3矩阵中,你可以这样写:

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

还要注意,多次访问本质上是免费的。只有当您构造(或者稍后调用时,才会发生昂贵的计算。

但是您的矩阵似乎是自伴随的(至少您的特征向量矩阵是单位的),因此您可能更喜欢使用。如果您的矩阵在编译时也碰巧知道大小为3x3,那么您甚至可以编写效率高得多的:

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

相关问题