Orbiter 2022
Combinatorial Objects
eigen_interface.cpp
Go to the documentation of this file.
1/*
2 * eigen_interface.cpp
3 *
4 * Created on: Dec 18, 2021
5 * Author: betten
6 */
7
8
9#include "foundations.h"
10
11
12#include <Eigen/Eigenvalues>
13
14using namespace Eigen;
15using namespace std;
16
17
18void orbiter_eigenvalues(int *Mtx, int nb_points, double *E, int verbose_level)
19{
20 int f_v = (verbose_level >= 1);
21
22 if (f_v) {
23 cout << "orbiter_eigenvalues" << endl;
24 }
25
26
27#if 0
28 MatrixXd X = MatrixXd::Random(5,5);
29 MatrixXd A = X + X.transpose();
30 cout << "Here is a random symmetric 5x5 matrix, A:" << endl << A << endl << endl;
31
32 SelfAdjointEigenSolver<MatrixXd> es(A);
33 cout << "The eigenvalues of A are:" << endl << es.eigenvalues() << endl;
34 cout << "The matrix of eigenvectors, V, is:" << endl << es.eigenvectors() << endl << endl;
35
36 double lambda = es.eigenvalues()[0];
37 cout << "Consider the first eigenvalue, lambda = " << lambda << endl;
38 VectorXd v = es.eigenvectors().col(0);
39 cout << "If v is the corresponding eigenvector, then lambda * v = " << endl << lambda * v << endl;
40 cout << "... and A * v = " << endl << A * v << endl << endl;
41
42 MatrixXd D = es.eigenvalues().asDiagonal();
43 MatrixXd V = es.eigenvectors();
44 cout << "Finally, V * D * V^(-1) = " << endl << V * D * V.inverse() << endl;
45#else
46
47 int i, j;
48
49 MatrixXd X(nb_points, nb_points);
50
51 for (i = 0; i < nb_points; i++) {
52 X(i, i) = 0;
53 }
54 for (i = 0; i < nb_points; i++) {
55 for (j = 0; j < nb_points; j++) {
56 X(i, j) = Mtx[i * nb_points + j];
57 }
58 }
59 SelfAdjointEigenSolver<MatrixXd> es(X);
60 if (f_v) {
61 cout << "The eigenvalues of X are:" << endl << es.eigenvalues() << endl;
62 cout << "The matrix of eigenvectors, V, is:" << endl << es.eigenvectors() << endl << endl;
63 }
64
65 for (i = 0; i < nb_points; i++) {
66 E[i] = es.eigenvalues()[i];
67 }
68
69#endif
70
71 if (f_v) {
72 cout << "orbiter_eigenvalues done" << endl;
73 }
74}
75
void orbiter_eigenvalues(int *Mtx, int nb_points, double *E, int verbose_level)