Rivet API documentation

Rivet 4.1.3
MatrixDiag.hh
1#ifndef RIVET_MATH_MATRIXDIAG
2#define RIVET_MATH_MATRIXDIAG
3
4#include "Rivet/Math/MathConstants.hh"
5#include "Rivet/Math/MatrixN.hh"
6
7// #include "gsl/gsl_vector.h"
8// #include "gsl/gsl_matrix.h"
9// #include "gsl/gsl_eigen.h"
10
11namespace Rivet {
12
13
14 template <size_t N>
15 class EigenSystem;
16 template <size_t N>
17 EigenSystem<N> diagonalize(const Matrix<N>& m);
18
19
21 template <size_t N>
22 class EigenSystem {
23 template <size_t M>
24 friend EigenSystem<M> diagonalize(const Matrix<M>&);
25
26 public:
27
28 typedef pair<double, Vector<N>> EigenPair;
29 typedef vector<EigenPair> EigenPairs;
30
31 Vector<N> getDiagVector() const {
32 assert(_eigenPairs.size() == N);
33 Vector<N> ret;
34 for (size_t i = 0; i < N; ++i) {
35 ret.set(i, _eigenPairs[i].first);
36 }
37 return ret;
38 }
39
40 Matrix<N> getDiagMatrix() const {
41 return Matrix<N>::mkDiag(getDiagVector());
42 }
43
44 EigenPairs getEigenPairs() const {
45 return _eigenPairs;
46 }
47
48 vector<double> getEigenValues() const {
49 assert(_eigenPairs.size() == N);
50 vector<double> ret;
51 for (size_t i = 0; i < N; ++i) {
52 ret.push_back(_eigenPairs[i].first);
53 }
54 return ret;
55 }
56
57 vector<Vector<N>> getEigenVectors() const {
58 assert(_eigenPairs.size() == N);
59 vector<Vector<N>> ret;
60 for (size_t i = 0; i < N; ++i) {
61 ret.push_back(_eigenPairs[i].second);
62 }
63 return ret;
64 }
65
66 private:
67
68 EigenPairs _eigenPairs;
69 };
70
71
73 template <size_t N>
74 struct EigenPairCmp : public std::binary_function<const typename EigenSystem<N>::EigenPair&,
75 const typename EigenSystem<N>::EigenPair&,
76 bool> {
77 bool operator()(const typename EigenSystem<N>::EigenPair& a,
78 const typename EigenSystem<N>::EigenPair& b) {
79 return a.first < b.first;
80 }
81 };
82
83
84 // /// Diagonalize an NxN matrix, returning a collection of pairs of
85 // /// eigenvalues and eigenvectors, ordered decreasing in eigenvalue.
86 // template <size_t N>
87 // EigenSystem<N> diagonalize(const Matrix<N>& m) {
88 // EigenSystem<N> esys;
89
90 // // Make a GSL matrix.
91 // gsl_matrix* A = gsl_matrix_alloc(N, N);
92 // for (size_t i = 0; i < N; ++i) {
93 // for (size_t j = 0; j < N; ++j) {
94 // gsl_matrix_set(A, i, j, m.get(i, j));
95 // }
96 // }
97
98 // // Use GSL diagonalization.
99 // gsl_matrix* vecs = gsl_matrix_alloc(N, N);
100 // gsl_vector* vals = gsl_vector_alloc(N);
101 // gsl_eigen_symmv_workspace* workspace = gsl_eigen_symmv_alloc(N);
102 // gsl_eigen_symmv(A, vals, vecs, workspace);
103 // gsl_eigen_symmv_sort(vals, vecs, GSL_EIGEN_SORT_VAL_DESC);
104
105 // // Build the vector of "eigen-pairs".
106 // typename EigenSystem<N>::EigenPairs eigensolns;
107 // for (size_t i = 0; i < N; ++i) {
108 // typename EigenSystem<N>::EigenPair ep;
109 // ep.first = gsl_vector_get(vals, i);
110 // Vector<N> ev;
111 // for (size_t j = 0; j < N; ++j) {
112 // ev.set(j, gsl_matrix_get(vecs, j, i));
113 // }
114 // ep.second = ev;
115 // eigensolns.push_back(ep);
116 // }
117
118 // // Free GSL memory.
119 // gsl_eigen_symmv_free(workspace);
120 // gsl_matrix_free(A);
121 // gsl_matrix_free(vecs);
122 // gsl_vector_free(vals);
123
124 // // Populate the returned object.
125 // esys._eigenPairs = eigensolns;
126 // return esys;
127 // }
128
129
130 template <size_t N>
131 inline const string toString(const typename EigenSystem<N>::EigenPair& e) {
132 ostringstream ss;
133 //for (typename EigenSystem<N>::EigenPairs::const_iterator i = e.begin(); i != e.end(); ++i) {
134 ss << e->first << " -> " << e->second;
135 // if (i+1 != e.end()) ss << endl;
136 //}
137 return ss.str();
138 }
139
140 template <size_t N>
141 inline ostream& operator<<(std::ostream& out, const typename EigenSystem<N>::EigenPair& e) {
142 out << toString(e);
143 return out;
144 }
145
146
147}
148
149#endif
General -dimensional mathematical matrix object.
Definition MatrixN.hh:30
Definition LHCbCommon.hh:9
std::ostream & operator<<(std::ostream &os, const AnalysisInfo &ai)
Stream an AnalysisInfo as a text description.
Definition AnalysisInfo.hh:463
std::string toString(const AnalysisInfo &ai)
String representation.