annotate include/linalg.hpp @ 12:6e06eb6ec448

Trivial change in include guards.
author Jordi Gutiérrez Hermoso <jordigh@gmail.com>
date Mon, 07 Jul 2008 13:07:11 -0500
parents d0076d9b2ef1
children 0531194a431d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
1 /*!\file linalg.hpp
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
2 * \brief Wrapper linear algebra classes for the GSL.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
3 *
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
4 * This header file puts some C++ wrappers around the GSL vector and
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
5 * matrix structures plus providing a C++ interface to some pertinent
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
6 * BLAS and general linear algebra routines.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
7 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
8
12
6e06eb6ec448 Trivial change in include guards.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11
diff changeset
9 #ifndef __LINALG_HPP__
6e06eb6ec448 Trivial change in include guards.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11
diff changeset
10 #define __LINALG_HPP__
0
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
11
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
12 #include <gsl/gsl_matrix.h>
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
13 #include <gsl/gsl_vector.h>
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
14 #include <gsl/gsl_permutation.h>
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
15 #include "error.hpp"
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
16
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
17 /// Linear algebra namespace
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
18 namespace linalg{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
19 using namespace error_handling;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
20
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
21 class slice;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
22 class vector;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
23 class vector_view;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
24
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
25 /// A wrapper class for GNU Scientific Library matrices
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
26 class matrix{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
27 private:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
28 class LUmatrix;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
29
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
30 public:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
31 //Constructors
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
32
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
33 /// Allocate 1x1 matrix zero matrix.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
34 matrix();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
35 /*! \brief Allocate m by n matrix, filled with some value.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
36 \param m - Number of rows.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
37 \param n - Number of columns.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
38 \param fillvalue - Value to fill matrix with, default is 0.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
39 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
40 matrix(const size_t m, const size_t n, const double fillvalue = 0) ;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
41 /// Assign a matrix from a GSL matrix pointer.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
42 matrix(gsl_matrix *M);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
43
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
44 /// Copy constructor
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
45 matrix(const matrix& M);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
46 /// Assignment.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
47 matrix operator=(const matrix& M);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
48
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
49 //Destructors
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
50
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
51 /// Clears the memory allocated by the GSL
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
52 ~matrix();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
53
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
54 /// Number of decimal digits to output.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
55 size_t precision() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
56 /// Set the number of decimal digits to output.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
57 static void set_precision(size_t p);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
58
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
59 /// Number of rows.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
60 size_t rows() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
61 /// Number of columns.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
62 size_t cols() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
63
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
64 /*! \brief Fortran-style parenthetical indexing (hence Octave-style too)
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
65 * Indices start from 1.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
66 * @param i - Row number.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
67 * @param j - Column number.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
68 * @return A reference to the matrix element.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
69 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
70 double& operator()(const size_t i, const size_t j);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
71
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
72 /// Constant version of previous function.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
73 const double& operator()(const size_t i, const size_t j) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
74
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
75 /*! \brief Indexing for vectorisation.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
76 * The GSL provides limited vectorisation routines which can be
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
77 * useful for operating on blocks of matrices all at once.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
78 * @param i - Row to be sliced.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
79 * @param b - Slice range.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
80 * @return A vector_view of the sliced row.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
81 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
82 vector_view operator()(const size_t i, const slice &b);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
83 /// Constant version of previous function.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
84 const vector_view operator()(const size_t i, const slice &b) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
85
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
86 /*! \brief Indexing for vectorisation.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
87 * The GSL provides limited vectorisation routines which can be
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
88 * useful for operating on blocks of matrices all at once.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
89 * @param a - Slice range
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
90 * @param j - column to be sliced.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
91 * @return A vector_view of the sliced column.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
92 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
93 vector_view operator()(const slice &a, const size_t j);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
94 /// Constant version of previous function.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
95 const vector_view operator()(const slice &a, const size_t j) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
96
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
97 //Arithmetic operations
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
98 ///Scale the matrix.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
99 matrix operator*(const double a) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
100 /// Matrix addition
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
101 matrix operator+(const matrix& N) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
102 /// Matrix multiplication
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
103 matrix operator*(const matrix& N) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
104 /// Matrix subtraction
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
105 matrix operator-(const matrix& N) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
106 /// Matrix vector product (gaxpy operation).
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
107 vector operator*(const vector& v) const; //Mv, where v is treated
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
108 //as a column vector.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
109
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
110 //More complex operations.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
111
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
112 /*! \brief Inverse.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
113 *
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
114 * This function returns the inverse matrix, computed via an LU
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
115 * factorisation. If the matrix is ill-conditioned or the inverse
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
116 * does not exist, it will happily return a matrix full of NaN.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
117 * \returns The inverse matrix.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
118 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
119 matrix inv() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
120 /*! \brief Tranpose.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
121 * Returns a copy of the original matrix, transposed. The original
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
122 * matrix is not modified.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
123 * \returns Transposed copy of matrix.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
124 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
125 matrix T() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
126 /*! \brief Trace.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
127 * The trace of a square matrix.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
128 * \returns The trace.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
129 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
130 double tr() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
131 /*! \brief Determinant.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
132 * The determinant computed via an LU factorisation
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
133 * \returns The determinant.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
134 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
135 double det() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
136
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
137 /*! \brief Solves Mv = w for v with LU factorisation.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
138 * Given another vector, will return the solution vector v to the
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
139 * equation Mv = w.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
140 * \param w - Another vector, must have the same size as number of
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
141 * rows in the matrix.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
142 * \returns The solution v to the equation Mv = w.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
143 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
144 vector inv(const vector& w) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
145
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
146 /*! \brief L2 condition number, using SVD.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
147 *
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
148 * This function computes the L2 condition number of a matrix, the
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
149 * largest singular value divided by the smallest. It directly
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
150 * uses the SVD decomposition (as provided by the GSL), and it may
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
151 * take a long time for large matrices.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
152 * \returns The L2 condition number.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
153 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
154 double cond() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
155
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
156 friend class vector_view;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
157 private:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
158 /*! \brief LU decomposition, pivots in U.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
159 *
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
160 * This function will compute the LU factorisation of a matrix,
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
161 * where the pivots are in the upper triangular matrix U and L has
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
162 * ones along the diagonal (not stored). For efficiency, L and U
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
163 * are both internally stored within a single matrix.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
164 * \returns A pointer to the private class LUmatrix.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
165 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
166 LUmatrix* LU() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
167
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
168 gsl_matrix * A;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
169
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
170 ///Precision
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
171 static size_t precsn;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
172 /// Machine epsilon
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
173 static const double eps;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
174
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
175 // Internal members, all can change, none of them affect the
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
176 // actual matrix per se.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
177 mutable LUmatrix* LUptr;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
178 mutable bool LUfactored;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
179
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
180 mutable double condition_number; //L2 condition number, obtained by svd.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
181 mutable gsl_vector* SVD; //Matrix's singular values.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
182 mutable bool SVDfactored;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
183
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
184 void SVDfactor() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
185
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
186 /// A private matrix member class for matrices factored in LU form.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
187 class LUmatrix{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
188 public:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
189 gsl_matrix* matrix_ptr();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
190 gsl_permutation* perm_ptr();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
191 int sgn();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
192 int* sgn_ptr();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
193
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
194 LUmatrix(gsl_matrix* M);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
195 LUmatrix(const LUmatrix& LU);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
196 LUmatrix operator=(const LUmatrix& LU);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
197 ~LUmatrix();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
198 private:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
199 // Private interface to the GSL.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
200 gsl_permutation* p;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
201 gsl_matrix* A;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
202 int signum;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
203 LUmatrix();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
204 };//End LUmatrix
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
205 }; //End matrix
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
206
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
207 /// A wrapper class for GSL vectors
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
208 class vector{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
209 public:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
210 //Constructors
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
211
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
212 ///Allocate zero vector of size one.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
213 vector();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
214 /*! \brief Allocate GSL vector of size n, filled with fillvalue
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
215 * \param n - Size of new vector
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
216 * \param fillvalue - Value for filling vector, default is 0.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
217 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
218 vector(const size_t n, const double fillvalue = 0);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
219 /// Associate a vector to a GSL vector pointer.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
220 vector(gsl_vector *y);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
221 /// Associate a vector to a constant GSL vector pointer.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
222 vector(const gsl_vector *y);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
223
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
224 /// Copy contstructor.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
225 vector(const vector& y);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
226 /// Assignment.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
227 vector& operator=(const vector &y);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
228
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
229 //Destructor
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
230 /// Clear memory assigned to vector by GSL.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
231 ~vector();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
232
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
233 //Number of decimal digits to output.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
234 /// Number of decimal digits to output
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
235 size_t precision() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
236 /// Set the number of decimal digits to output
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
237 static void set_precision(size_t p);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
238
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
239 ///Number of elements
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
240 size_t size() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
241
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
242 /*! \brief Fortran-style parenthetical indexing (hence
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
243 * Octave-style too). Indices start at 1.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
244 * \param i - Index number.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
245 * \return A reference to the vector element.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
246 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
247 double& operator()(const size_t i);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
248
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
249 /// Constant version of previous function.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
250 const double& operator()(const size_t i) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
251
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
252 /*! \brief Indexing for vectorisation.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
253 * The GSL provides limited vectorisation routines which can be
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
254 * useful for operating on blocks of vectors all at once.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
255 * @param v - Slice range.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
256 * @return A vector_view of the slice.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
257 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
258 vector_view operator()(const slice &v);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
259 ///Constant version of previous function.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
260 const vector_view operator()(const slice &v) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
261
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
262 //Arithmetic operations:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
263 ///Scale the vector.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
264 vector operator*(const double a) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
265 ///Vector addition.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
266 vector operator+(const vector& w) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
267 ///Vector subtration.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
268 vector operator-(const vector& w) const;
11
d0076d9b2ef1 Conclude precomputation revision
Jordi Guitérrez Hermoso <jordigh@gmail.com>
parents: 0
diff changeset
269 ///Dot product.
0
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
270 double operator*(const vector& w) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
271 ///Computes vM where v is treated as a row vector.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
272 vector operator*(const matrix& M) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
273
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
274 //Comparison
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
275
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
276 /// Compares vectors elementwise, using machine epsilon.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
277 bool operator==(const vector& w) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
278 /*! \brief Lexicographical order, used for putting into STL sets or
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
279 * maps.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
280 *
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
281 * Lexicographical ordering of vectors. Vectors of smaller
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
282 * dimension are smaller.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
283 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
284 bool operator<(const vector& w) const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
285
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
286 //More complex operations
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
287 ///Euclidean norm.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
288 double norm() const;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
289
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
290 friend class vector_view;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
291 friend class matrix;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
292 private:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
293 /// Pointer to associated GSL vector.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
294 gsl_vector * x;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
295 /// Output precision.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
296 static size_t precsn;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
297 /// Machine epsilon
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
298 static const double eps;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
299 };
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
300
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
301
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
302 /*! \brief A vector that doesn't own its data; rather, points to data owned
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
303 * by another vector.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
304 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
305 class vector_view : public vector{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
306 friend class vector;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
307 friend class matrix;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
308 public:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
309 ~vector_view();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
310 /// Assignment to a vector; will share same data in memory as that
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
311 /// other vector.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
312 vector_view& operator=(const vector& w);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
313 /// Assignment, useful for modifying chunks of vectors all at once.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
314 vector_view& operator=(const vector_view& w);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
315 private:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
316 /// vector_views are invisible to the user and can only
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
317 /// be created using slices and matrix or vector indexing.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
318 vector_view();
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
319 /// See above.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
320 vector_view(gsl_vector* y, const slice& s);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
321 /// See above.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
322 vector_view(gsl_matrix* A, const slice& a, const size_t j);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
323 /// See above.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
324 vector_view(gsl_matrix* A, const size_t i, const slice& b);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
325 };
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
326
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
327
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
328 /*! \brief Vector slices corresponding to GNU Octave ranges.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
329 *
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
330 * Vector slices are useful for certain vectorisation routines and
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
331 * for referring to rows, columns, or equally spaced chunks of a
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
332 * vector or a matrix. Set a begininning and an end for the
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
333 * stride, and a step size, and this will be the elements that can
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
334 * be indexed by this slice in a vector or matrix. E.g. if the
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
335 * beginning is 2, the end 8, and the stride is 2, then this
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
336 * refers to the slice [2, 4, 6, 8]. The default stride is 1.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
337 *
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
338 * Unlike GNU Octave slices, there is no shorthand for referring
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
339 * to the entirety of a column or row of a matrix. Must instead
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
340 * create a slice for that purpose as s(1,n) where n is the number
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
341 * of rows or columns respectively.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
342 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
343 class slice{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
344 public:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
345 /*! \brief Create a vector slice.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
346 *
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
347 * \param a - Beginning of the slice.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
348 * \param b - End of the slice.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
349 * \param k - Stride (default is 1).
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
350 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
351 slice(size_t a, size_t b, size_t k=1);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
352
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
353 /*! For setting the slice parameters anew.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
354 *
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
355 * Indices start from 1.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
356 * \param a - Beginning of the slice.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
357 * \param b - End of the slice.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
358 * \param k - Stride (default is 1).
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
359 */
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
360 slice operator()(size_t a, size_t b, size_t k=1);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
361 slice set(size_t a, size_t b, size_t k=1) ;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
362
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
363 size_t begin()const {return beg;};
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
364 size_t end() const{return fin;};
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
365 size_t stride() const{return str;};
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
366
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
367 private:
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
368 /// Empty and private default constructor.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
369 slice(){};
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
370 size_t beg,fin;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
371 size_t str;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
372 };
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
373
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
374 /// Useful alias, vectors are also points in space.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
375 typedef vector point; //Useful alias.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
376 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
377
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
378 namespace linalg{ //Non-member functions.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
379
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
380 // I/O
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
381
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
382 ///Stream insertion operator
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
383 std::ostream& operator<<(std::ostream& os, const vector &v);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
384 ///Stream extraction operator
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
385 vector operator>>(std::istream& is, vector& v);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
386 ///Stream insertion operator
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
387 std::ostream& operator<<(std::ostream& os, const matrix &M);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
388 ///Stream extraction operator
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
389 matrix operator>>(std::istream& is, matrix& v);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
390
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
391 //Some arithmetic functions for comfortable syntax.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
392
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
393 /// Scale a vector.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
394 vector operator*(double a, const vector& v);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
395 /// Euclidean norm of a vector.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
396 double norm(const vector& v);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
397 /// Scale a matrix.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
398 matrix operator*(double a, const matrix& M);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
399 /// Matrix inverse, computed with LU factorisation.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
400 matrix inv(const matrix& A);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
401 /// Return copy of transposed matrix.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
402 matrix T(const matrix& A);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
403 /// Trace.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
404 double tr(const matrix& A);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
405 /// Determinant.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
406 double det(matrix& A);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
407 /// L2 condition number, computed with SVD.
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
408 double cond(matrix& A);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
409
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
410 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
411
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
412 //Inlined functions
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
413 namespace linalg{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
414 inline double& matrix::operator()(const size_t i, const size_t j){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
415 try{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
416 if(LUfactored)
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
417 delete LUptr;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
418 if(SVDfactored)
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
419 gsl_vector_free(SVD);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
420
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
421 LUfactored = false;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
422 SVDfactored = false;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
423 return(*gsl_matrix_ptr(A,i-1,j-1));
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
424 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
425 catch(indexOutOfRange& exc){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
426 exc.i = i;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
427 exc.j = j;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
428 exc.m = A -> size1;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
429 exc.n = A -> size2;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
430 throw exc;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
431 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
432 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
433 inline const double& matrix::operator()(const size_t i,
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
434 const size_t j) const{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
435 try{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
436 return(*gsl_matrix_const_ptr(A,i-1,j-1));
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
437 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
438 catch(indexOutOfRange& exc){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
439 exc.i = i;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
440 exc.j = j;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
441 exc.m = A -> size1;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
442 exc.n = A -> size2;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
443 throw exc;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
444 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
445 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
446
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
447 inline double& vector::operator()(const size_t i) {
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
448 try{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
449 return *gsl_vector_ptr(x,i-1);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
450 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
451 catch(indexOutOfRange& exc){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
452 exc.i = i;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
453 exc.n = x -> size;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
454 throw exc;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
455 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
456 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
457
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
458 inline const double& vector::operator()(const size_t i) const {
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
459 try{
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
460 return *gsl_vector_const_ptr(x,i-1);
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
461 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
462 catch(indexOutOfRange& exc){
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
463 exc.i = i;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
464 exc.n = x -> size;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
465 throw exc;
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
466 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
467 }
4fa56dc7e271 Initial commit
jordi@Iris
parents:
diff changeset
468 }
12
6e06eb6ec448 Trivial change in include guards.
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11
diff changeset
469 #endif //__LINALG_HPP__