GammaLib 2.0.0
Loading...
Searching...
No Matches
GMatrixSymmetric.hpp
Go to the documentation of this file.
1/***************************************************************************
2 * GMatrixSymmetric.hpp - Symmetric matrix class *
3 * ----------------------------------------------------------------------- *
4 * copyright (C) 2006-2017 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- *
6 * *
7 * This program is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
19 * *
20 ***************************************************************************/
21/**
22 * @file GMatrixSymmetric.hpp
23 * @brief Symmetric matrix class definition
24 * @author Juergen Knoedlseder
25 */
26
27#ifndef GMATRIXSYMMETRIC_HPP
28#define GMATRIXSYMMETRIC_HPP
29
30/* __ Includes ___________________________________________________________ */
31#include <string>
32#include "GMatrixBase.hpp"
33
34/* __ Forward declarations _______________________________________________ */
35class GMatrix;
36class GMatrixSparse;
37class GVector;
38
39
40/***********************************************************************//**
41 * @class GMatrixSymmetric
42 *
43 * @brief Symmetric matrix class interface definition
44 *
45 * This class implements a symmetric matrix. The class stores only a triangle
46 * physically, imposing thus strict matrix symmetry.
47 *
48 * For a description of the common matrix methods, please refer to the
49 * GMatrixBase class.
50 *
51 * Matrix allocation is done using the constructors
52 *
53 * GMatrixSymmetric symmetricmatrix(rows, columns);
54 * GMatrixSymmetric symmetricmatrix(matrix);
55 * GMatrixSymmetric symmetricmatrix(sparsematrix);
56 * GMatrixSymmetric symmetricmatrix(symmetricmatrix);
57 *
58 * where @p rows and @p columns specify the number of rows and columns of
59 * the matrix. Storage conversion constructors exist that allow allocating
60 * a symmetric matrix by copying from a sparse matrix of type GMatrixSparse
61 * and a general matrix of type GMatrix. Exceptions will be thrown in case
62 * that the matrix from which the object should be allocated is not
63 * symmetric.
64 *
65 * Methods are available to extract the lower or the upper triangle of the
66 * matrix:
67 *
68 * matrix.extract_lower_triangle();
69 * matrix.extract_upper_triangle();
70 ***************************************************************************/
72
73public:
74 // Constructors and destructors
75 GMatrixSymmetric(void);
76 explicit GMatrixSymmetric(const int& rows, const int& columns);
77 GMatrixSymmetric(const GMatrix& matrix);
78 GMatrixSymmetric(const GMatrixSparse& matrix);
80 virtual ~GMatrixSymmetric(void);
81
82 // Implemented pure virtual base class operators
83 virtual double& operator()(const int& row, const int& column);
84 virtual const double& operator()(const int& row, const int& column) const;
85 virtual GVector operator*(const GVector& v) const;
86
87 // Other operators
88 virtual GMatrixSymmetric& operator=(const GMatrixSymmetric& matrix);
89 virtual GMatrixSymmetric& operator=(const double& value);
90 virtual GMatrixSymmetric operator+(const GMatrixSymmetric& matrix) const;
91 virtual GMatrixSymmetric operator+(const double& scalar) const;
92 virtual GMatrixSymmetric operator-(const GMatrixSymmetric& matrix) const;
93 virtual GMatrixSymmetric operator-(const double& scalar) const;
94 virtual GMatrix operator*(const GMatrixSymmetric& matrix) const;
95 virtual GMatrixSymmetric operator-(void) const;
96 virtual GMatrixSymmetric& operator+=(const GMatrixSymmetric& matrix);
97 virtual GMatrixSymmetric& operator+=(const double& scalar);
98 virtual GMatrixSymmetric& operator-=(const GMatrixSymmetric& matrix);
99 virtual GMatrixSymmetric& operator-=(const double& scalar);
100 virtual GMatrixSymmetric& operator*=(const double& scaler);
101 virtual GMatrixSymmetric& operator/=(const double& scalar);
102
103 // Implemented pure virtual base class methods
104 virtual void clear(void);
105 virtual GMatrixSymmetric* clone(void) const;
106 virtual std::string classname(void) const;
107 virtual double& at(const int& row, const int& column);
108 virtual const double& at(const int& row, const int& column) const;
109 virtual GVector row(const int& row) const;
110 virtual void row(const int& row, const GVector& vector);
111 virtual GVector column(const int& column) const;
112 virtual void column(const int& column, const GVector& vector);
113 virtual void add_to_row(const int& row, const GVector& vector);
114 virtual void add_to_column(const int& column, const GVector& vector);
115 virtual double fill(void) const;
116 virtual double min(void) const;
117 virtual double max(void) const;
118 virtual double sum(void) const;
119 virtual std::string print(const GChatter& chatter = NORMAL) const;
120
121 // Other methods
122 GMatrixSymmetric transpose(void) const;
123 GMatrixSymmetric invert(void) const;
124 GVector solve(const GVector& vector) const;
125 GMatrixSymmetric abs(void) const;
128 GMatrixSymmetric cholesky_decompose(const bool& compress = true) const;
129 GVector cholesky_solver(const GVector& vector, const bool& compress = true) const;
130 GMatrixSymmetric cholesky_invert(const bool& compress = true) const;
131
132private:
133 // Private methods
134 void init_members(void);
135 void copy_members(const GMatrixSymmetric& matrix);
136 void free_members(void);
137 void alloc_members(const int& rows, const int& columns);
138 void set_inx(void);
139
140 // Private data area
141 int m_num_inx; //!< Number of indices in array
142 int* m_inx; //!< Index array of non-zero rows/columns
143};
144
145
146/***********************************************************************//**
147 * @brief Return class name
148 *
149 * @return String containing the class name ("GMatrixSymmetric").
150 ***************************************************************************/
151inline
152std::string GMatrixSymmetric::classname(void) const
153{
154 return ("GMatrixSymmetric");
155}
156
157
158/***********************************************************************//**
159 * @brief Return transposed matrix
160 *
161 * @return Transposed matrix.
162 *
163 * Returns transposed matrix of the matrix. As the transposed matrix of a
164 * symmetric matrix is identical to the original matrix, this method simply
165 * returns the actual matrix.
166 ***************************************************************************/
167inline
169{
170 return (*this);
171}
172
173
174/***********************************************************************//**
175 * @brief Return minimum matrix element
176 *
177 * @return Minimum matrix element
178 *
179 * Returns the smallest element in the matrix.
180 ***************************************************************************/
181inline
182double GMatrixSymmetric::min(void) const
183{
184 return (get_min_element());
185}
186
187
188/***********************************************************************//**
189 * @brief Return maximum matrix element
190 *
191 * @return Maximum matrix element
192 *
193 * Returns the largest element in the matrix.
194 ***************************************************************************/
195inline
196double GMatrixSymmetric::max(void) const
197{
198 return (get_max_element());
199}
200
201
202/***********************************************************************//**
203 * @brief Binary matrix addition
204 *
205 * @param[in] matrix Matrix.
206 * @return Result of matrix addition.
207 *
208 * Returns the sum of two matrices. The method makes use of the unary
209 * addition operator.
210 ***************************************************************************/
211inline
213{
214 GMatrixSymmetric result = *this;
215 result += matrix;
216 return result;
217}
218
219
220/***********************************************************************//**
221 * @brief Binary matrix scalar addition
222 *
223 * @param[in] scalar Scalar.
224 * @return Matrix with @p scalar added.
225 *
226 * Returns a matrix where a @p scalar has been added to each matrix element.
227 ***************************************************************************/
228inline
230{
231 GMatrixSymmetric result = *this;
232 result += scalar;
233 return result;
234}
235
236
237/***********************************************************************//**
238 * @brief Binary matrix subtraction
239 *
240 * @param[in] matrix Matrix.
241 * @return Result of matrix subtraction.
242 *
243 * Returns the difference between two matrices. The method makes use of the
244 * unary subtraction operator.
245 ***************************************************************************/
246inline
248{
249 GMatrixSymmetric result = *this;
250 result -= matrix;
251 return result;
252}
253
254
255/***********************************************************************//**
256 * @brief Binary matrix scalar subtraction
257 *
258 * @param[in] scalar Scalar.
259 * @return Matrix with @p scalar subtracted.
260 *
261 * Returns a matrix where a @p scalar has been subtracted from each matrix
262 * element.
263 ***************************************************************************/
264inline
266{
267 GMatrixSymmetric result = *this;
268 result -= scalar;
269 return result;
270}
271
272
273/***********************************************************************//**
274 * @brief Scale matrix elements
275 *
276 * @param[in] scalar Scale factor.
277 * @return Matrix with elements multiplied by @p scalar.
278 *
279 * Returns a matrix where all elements have been multiplied by the specified
280 * @p scalar value.
281 ***************************************************************************/
282inline
284{
285 scale_elements(scalar);
286 return *this;
287}
288
289
290/***********************************************************************//**
291 * @brief Divide matrix elements
292 *
293 * @param[in] scalar Scalar.
294 * @return Matrix with elements divided by @p scalar.
295 *
296 * Returns a matrix where all elements have been divided by the specified
297 * @p scalar value.
298 ***************************************************************************/
299inline
301{
302 *this *= 1.0/scalar;
303 return *this;
304}
305
306
307/***********************************************************************//**
308 * @brief Multiply matrix by scalar
309 *
310 * @param[in] matrix Matrix.
311 * @param[in] scalar Scalar.
312 * @return Matrix divided by @p scalar.
313 *
314 * Returns a matrix where each element is multiplied by @p scalar.
315 ***************************************************************************/
316inline
317GMatrixSymmetric operator*(const GMatrixSymmetric& matrix, const double& scalar)
318{
319 GMatrixSymmetric result = matrix;
320 result *= scalar;
321 return result;
322}
323
324
325/***********************************************************************//**
326 * @brief Multiply matrix by scalar
327 *
328 * @param[in] scalar Scalar.
329 * @param[in] matrix Matrix.
330 * @return Matrix divided by @p scalar.
331 *
332 * Returns a matrix where each element is multiplied by @p scalar.
333 ***************************************************************************/
334inline
335GMatrixSymmetric operator*(const double& scalar, const GMatrixSymmetric& matrix)
336{
337 GMatrixSymmetric result = matrix;
338 result *= scalar;
339 return result;
340}
341
342
343/***********************************************************************//**
344 * @brief Divide matrix by scalar
345 *
346 * @param[in] matrix Matrix.
347 * @param[in] scalar Scalar.
348 * @return Matrix divided by @p scalar.
349 *
350 * Returns a matrix where each element is divided by @p scalar.
351 ***************************************************************************/
352inline
353GMatrixSymmetric operator/(const GMatrixSymmetric& matrix, const double& scalar)
354{
355 GMatrixSymmetric result = matrix;
356 result /= scalar;
357 return result;
358}
359
360#endif /* GMATRIXSYMMETRIC_HPP */
Abstract matrix base class definition.
GMatrixSymmetric operator*(const GMatrixSymmetric &matrix, const double &scalar)
Multiply matrix by scalar.
GMatrixSymmetric operator/(const GMatrixSymmetric &matrix, const double &scalar)
Divide matrix by scalar.
GChatter
Definition GTypemaps.hpp:33
@ NORMAL
Definition GTypemaps.hpp:36
Abstract matrix base class interface definition.
void scale_elements(const double &scalar)
Scale all matrix elements with a scalar.
const int & rows(void) const
Return number of matrix rows.
double get_max_element(void) const
Returns maximum matrix element.
const int & columns(void) const
Return number of matrix columns.
double get_min_element(void) const
Return minimum matrix element.
Sparse matrix class interface definition.
Symmetric matrix class interface definition.
virtual void add_to_row(const int &row, const GVector &vector)
Add row to matrix elements.
void copy_members(const GMatrixSymmetric &matrix)
Copy class members.
GVector cholesky_solver(const GVector &vector, const bool &compress=true) const
Cholesky solver.
virtual GMatrixSymmetric operator-(void) const
Negate matrix elements.
virtual GMatrixSymmetric & operator-=(const GMatrixSymmetric &matrix)
Unary matrix subtraction operator.
GMatrixSymmetric transpose(void) const
Return transposed matrix.
GMatrix extract_lower_triangle(void) const
Extract lower triangle of matrix.
GMatrixSymmetric cholesky_decompose(const bool &compress=true) const
Return Cholesky decomposition.
virtual void clear(void)
Clear matrix.
GMatrixSymmetric cholesky_invert(const bool &compress=true) const
Invert matrix using a Cholesky decomposition.
virtual GMatrixSymmetric & operator/=(const double &scalar)
Divide matrix elements.
virtual std::string print(const GChatter &chatter=NORMAL) const
Print matrix.
virtual GVector operator*(const GVector &v) const
Vector multiplication.
GMatrixSymmetric(void)
Void constructor.
virtual GMatrixSymmetric operator+(const GMatrixSymmetric &matrix) const
Binary matrix addition.
virtual void add_to_column(const int &column, const GVector &vector)
Add vector column into matrix.
GMatrixSymmetric invert(void) const
Return inverted matrix.
virtual std::string classname(void) const
Return class name.
virtual double sum(void) const
Sum matrix elements.
virtual GVector row(const int &row) const
Extract row as vector from matrix.
GVector solve(const GVector &vector) const
Solves linear matrix equation.
virtual GVector column(const int &column) const
Extract column as vector from matrix.
void init_members(void)
Initialise class mambers.
virtual ~GMatrixSymmetric(void)
Destructor.
virtual double & at(const int &row, const int &column)
Return reference to matrix element.
virtual GMatrixSymmetric & operator=(const GMatrixSymmetric &matrix)
Matrix assignment operator.
virtual double fill(void) const
Determine fill of matrix.
virtual GMatrixSymmetric & operator+=(const GMatrixSymmetric &matrix)
Unary matrix addition operator.
void alloc_members(const int &rows, const int &columns)
Allocates matrix memory.
void free_members(void)
Delete class members.
virtual double min(void) const
Return minimum matrix element.
int * m_inx
Index array of non-zero rows/columns.
GMatrix extract_upper_triangle(void) const
Extract upper triangle of matrix.
int m_num_inx
Number of indices in array.
GMatrixSymmetric abs(void) const
Return absolute of matrix.
virtual GMatrixSymmetric & operator*=(const double &scaler)
Scale matrix elements.
void set_inx(void)
Set index selection.
virtual double & operator()(const int &row, const int &column)
Return reference to matrix element.
virtual double max(void) const
Return maximum matrix element.
virtual GMatrixSymmetric * clone(void) const
Clone matrix.
Generic matrix class definition.
Definition GMatrix.hpp:79
Vector class.
Definition GVector.hpp:46