Как назначить «Eigen :: EigenSolver <MatrixXd>es (Matrix)» переменной, которую я могу использовать позже? - PullRequest
0 голосов
/ 19 апреля 2020

Я успешно могу получить собственные значения и собственные векторы из команды Eigen :: EigenSolver, однако я не могу назначить их новой матрице. Мне нужно присвоить 3 собственных вектора новой матрице 3x3, чтобы я мог выполнить транспонирование, а затем умножение матриц на другую матрицу 3x3.

Я получаю следующую ошибку с зеленой морковкой, указывающей на «b» в часть "{a = b;}":

/ Eigen / src / Core / functors / AssignmentFunctors.h: 24: 104: ошибка: присвоение 'double' из несовместимого типа 'const std :: __ 1 :: complex 'EIGEN_DEVICE_FUN C EIGEN_STRONG_INLINE void assignCoeff (DstScalar & a, const SrcScalar & b) const {a = b; }

Я попытался объявить новую переменную, которой я пытаюсь присвоить ее, как MatrixXd или Vector3d, но ни одна из них не работает. Я думаю, что проблема связана с тем, что Eigensolver возвращает каждый элемент как (Real, Complex), и я не манипулирую этим должным образом. Это не было бы плохо, если бы мне нужно было вычислить значения только один раз. Тем не менее, мне нужно отбросить эти вычисления в al oop, и окончательные вычисления из этого процесса будут затем проверены по некоторым условным условиям, чтобы определить, приводят ли случайные значения, используемые в коде, к действительным результатам.

[РЕДАКТИРОВАНИЕ 19 апреля 2020, 1152]. Я только хочу использовать Реальные части для моих текущих расчетов. Спасибо @stark за то, что вы обратили на это мое внимание в комментариях.

Любая помощь будет принята с благодарностью. Пожалуйста, имейте в виду, я не программист по образованию, я изучаю физику и математику, и я привык работать с программным обеспечением Symboli c и 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 Quark Матрица:
(-1.00393,0)
(1.01004,0)
(1.00393,0)

Собственные векторы Up Quark: (-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)

Собственные значения матрицы Yukawa Down Quark:
(-1,96316,0)
(2.07543,0)
(1.96316,0)

Собственные векторы Down Quark, 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)

1 Ответ

1 голос
/ 19 апреля 2020

Вы пытаетесь присвоить комплексную матрицу 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...