我能够成功地从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);