1 #ifndef RIVET_MATH_MATRIXDIAG 2 #define RIVET_MATH_MATRIXDIAG 4 #include "Rivet/Math/MathHeader.hh" 5 #include "Rivet/Math/MatrixN.hh" 7 #include "gsl/gsl_vector.h" 8 #include "gsl/gsl_matrix.h" 9 #include "gsl/gsl_eigen.h" 28 typedef pair<double, Vector<N> > EigenPair;
29 typedef vector<EigenPair> EigenPairs;
32 assert(_eigenPairs.size() == N);
34 for (
size_t i = 0; i < N; ++i) {
35 ret.
set(i, _eigenPairs[i].first);
44 EigenPairs getEigenPairs()
const {
48 vector<double> getEigenValues()
const {
49 assert(_eigenPairs.size() == N);
51 for (
size_t i = 0; i < N; ++i) {
52 ret.push_back(_eigenPairs[i].first);
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);
68 EigenPairs _eigenPairs;
76 public std::binary_function<const typename EigenSystem<N>::EigenPair&,
77 const typename EigenSystem<N>::EigenPair&, bool> {
78 bool operator()(
const typename EigenSystem<N>::EigenPair& a,
79 const typename EigenSystem<N>::EigenPair& b) {
80 return a.first < b.first;
92 gsl_matrix* A = gsl_matrix_alloc(N, N);
93 for (
size_t i = 0; i < N; ++i) {
94 for (
size_t j = 0; j < N; ++j) {
95 gsl_matrix_set(A, i, j, m.get(i, j));
100 gsl_matrix* vecs = gsl_matrix_alloc(N, N);
101 gsl_vector* vals = gsl_vector_alloc(N);
102 gsl_eigen_symmv_workspace* workspace = gsl_eigen_symmv_alloc(N);
103 gsl_eigen_symmv(A, vals, vecs, workspace);
104 gsl_eigen_symmv_sort(vals, vecs, GSL_EIGEN_SORT_VAL_DESC);
107 typename EigenSystem<N>::EigenPairs eigensolns;
108 for (
size_t i = 0; i < N; ++i) {
109 typename EigenSystem<N>::EigenPair ep;
110 ep.first = gsl_vector_get(vals, i);
112 for (
size_t j = 0; j < N; ++j) {
113 ev.
set(j, gsl_matrix_get(vecs, j, i));
116 eigensolns.push_back(ep);
120 gsl_eigen_symmv_free(workspace);
122 gsl_matrix_free(vecs);
123 gsl_vector_free(vals);
126 esys._eigenPairs = eigensolns;
132 inline const string toString(
const typename EigenSystem<N>::EigenPair& e) {
135 ss << e->first <<
" -> " << e->second;
142 inline ostream& operator<<(std::ostream& out, const typename EigenSystem<N>::EigenPair& e) {
Definition: ALICE_2010_I880049.cc:13
EigenSystem< N > diagonalize(const Matrix< N > &m)
Definition: MatrixDiag.hh:88
Handy object containing results of a diagonalization.
Definition: MatrixDiag.hh:15
Vector< N > & set(const size_t index, const double value)
Set indexed value.
Definition: VectorN.hh:60
General -dimensional mathematical matrix object.
Definition: MatrixN.hh:14
A minimal base class for -dimensional vectors.
Definition: VectorN.hh:13
Comparison functor for "eigen-pairs".
Definition: MatrixDiag.hh:75
std::string toString(const AnalysisInfo &ai)
String representation.
Definition: AnalysisInfo.cc:144