ARTS 2.5.10 (git: 2f1c442c)
|
Implementation of Matrix, Vector, and such stuff. More...
#include <algorithm>
#include <utility>
#include "array.h"
#include "matpack.h"
#include "matpack_concepts.h"
Go to the source code of this file.
Classes | |
class | Joker |
The Joker class. More... | |
class | Range |
The range class. More... | |
struct | Shape< N > |
Helper shape class. More... | |
class | Iterator1D |
The iterator class for sub vectors. More... | |
class | ConstIterator1D |
The constant iterator class for sub vectors. More... | |
class | ConstVectorView |
A constant view of a Vector. More... | |
class | VectorView |
The VectorView class. More... | |
class | Iterator2D |
The row iterator class for sub matrices. More... | |
class | ConstIterator2D |
The const row iterator class for sub matrices. More... | |
class | Vector |
The Vector class. More... | |
class | ConstMatrixView |
A constant view of a Matrix. More... | |
class | MatrixView |
The MatrixView class. More... | |
class | Matrix |
The Matrix class. More... | |
Macros | |
#define | GETFUN(n) *(mdata + mrange.mstart + n * mrange.mstride) |
#define | GETFUN(r, c) *(mdata + mrr.mstart + r * mrr.mstride + mcr.mstart + c * mcr.mstride) |
Typedefs | |
using | ArrayOfVector = Array< Vector > |
An array of vectors. | |
using | ArrayOfArrayOfVector = Array< ArrayOfVector > |
using | ArrayOfMatrix = Array< Matrix > |
An array of matrices. | |
using | ArrayOfArrayOfMatrix = Array< ArrayOfMatrix > |
Functions | |
void | copy (ConstIterator1D origin, const ConstIterator1D &end, Iterator1D target) |
void | copy (Numeric x, Iterator1D target, const Iterator1D &end) ARTS_NOEXCEPT |
Copy a scalar to all elements. | |
void | copy (ConstIterator2D origin, const ConstIterator2D &end, Iterator2D target) |
Copy data between begin and end to target. | |
void | copy (Numeric x, Iterator2D target, const Iterator2D &end) ARTS_NOEXCEPT |
Copy a scalar to all elements. | |
void | mult (VectorView y, const ConstMatrixView &M, const ConstVectorView &x) |
Matrix-Vector Multiplication. | |
void | mult_general (MatrixView A, const ConstMatrixView &B, const ConstMatrixView &C) ARTS_NOEXCEPT |
General matrix multiplication. | |
void | mult (MatrixView A, const ConstMatrixView &B, const ConstMatrixView &C) |
Matrix-Matrix Multiplication. | |
void | cross3 (VectorView c, const ConstVectorView &a, const ConstVectorView &b) ARTS_NOEXCEPT |
cross3 | |
Numeric | vector_angle (ConstVectorView a, ConstVectorView b) |
void | proj (Vector &c, ConstVectorView a, ConstVectorView b) ARTS_NOEXCEPT |
ConstMatrixView | transpose (ConstMatrixView m) ARTS_NOEXCEPT |
Const version of transpose. | |
MatrixView | transpose (MatrixView m) ARTS_NOEXCEPT |
Returns the transpose. | |
void | transform (VectorView y, double(&my_func)(double), ConstVectorView x) |
A generic transform function for vectors, which can be used to implement mathematical functions operating on all elements. | |
void | transform (MatrixView y, double(&my_func)(double), ConstMatrixView x) |
A generic transform function for matrices, which can be used to implement mathematical functions operating on all elements. | |
Numeric | max (const ConstVectorView &x) ARTS_NOEXCEPT |
Max function, vector version. | |
Numeric | max (const ConstMatrixView &x) ARTS_NOEXCEPT |
Max function, matrix version. | |
Numeric | min (const ConstVectorView &x) ARTS_NOEXCEPT |
Min function, vector version. | |
Numeric | min (const ConstMatrixView &x) ARTS_NOEXCEPT |
Min function, matrix version. | |
Numeric | mean (const ConstVectorView &x) ARTS_NOEXCEPT |
Mean function, vector version. | |
Numeric | nanmean (const ConstVectorView &x) ARTS_NOEXCEPT |
Mean function, vector version ignoring nans and infs. | |
Numeric | mean (const ConstMatrixView &x) ARTS_NOEXCEPT |
Mean function, matrix version. | |
Numeric | operator* (const ConstVectorView &a, const ConstVectorView &b) ARTS_NOEXCEPT |
Scalar product. | |
Numeric | debug_matrixview_get_elem (MatrixView &mv, Index r, Index c) |
Helper function to access matrix elements. | |
Variables | |
const Joker | joker |
Implementation of Matrix, Vector, and such stuff.
A VectorView consists of the data, which is stored in a continuous piece of memory, and a selection, specified by start, extend, and stride. A Vector is a VectorView which also allocates its memory automatically.
VectorViews can not be generated directly, they only result from operations on Vectors, such as using the index operator with a Range object. However, you can store them, like:
VectorView A = B[Range(0,3)]
A VectorView acts like a reference to the selected region in the parent matrix. Functions that operate on an existing matrix (i.e., they do not use resize) should take VectorView x as arguement, rather than Vector& x. That has the advantage that they can be called either with a VectorView or Vector. E.g., if you have:
void fill_with_junk(VectorView x); Vector v;
then you can call the function in these two ways:
fill_with_junk(v); fill_with_junk(v[Range(1,3)])
Assignment (=) copies the data from one Vector or VectorView to another one. Dimensions must agree. Only exceptions are the copy constructors which automatically set the dimensions to match.
Things work in the same way for the type Matrix.
There exist operators *=, /=, +=, and -= to multiply (divide,...) by a scalar. Plain operators *,... do not exist, because they would result in the creation of temporaries and therefor be inefficient.
However, you can use * to compute the scalar product. This is efficient, since the return value is just a scalar.
There is a constructor for vector filling it with a sequence of values.
Matrices:
You can extract sub matrices (MatrixView) using Range objects. You can also extract rows and columns this way.
transpose(A) Returns a special MatrixView that is the transpose of the original. The original is not changed by this!
mult(A,B,C) computes A = B*C Note that the order is different from MTL (output first)!
A VectorView or Vector can be taken in the place of a nx1 matrix. That means, Vectors are interpreted as column vectors. Hence, you can compute:
Vector a(10),b(20); Matrix M(10,20);
mult(a,M,b); // a = M*b
but also, by using transpose:
mult(transpose(b),transpose(a),M); // b^t = a^t * M
See the section about Matrices and Vectors in the ARTS user guide for more details.
Definition in file matpackI.h.
#define GETFUN | ( | n | ) | *(mdata + mrange.mstart + n * mrange.mstride) |
Definition at line 1201 of file matpackI.h.
Definition at line 1201 of file matpackI.h.
using ArrayOfArrayOfMatrix = Array<ArrayOfMatrix> |
Definition at line 1451 of file matpackI.h.
using ArrayOfArrayOfVector = Array<ArrayOfVector> |
Definition at line 1446 of file matpackI.h.
using ArrayOfMatrix = Array<Matrix> |
An array of matrices.
Definition at line 1449 of file matpackI.h.
using ArrayOfVector = Array<Vector> |
An array of vectors.
Definition at line 1444 of file matpackI.h.
void copy | ( | ConstIterator1D | origin, |
const ConstIterator1D & | end, | ||
Iterator1D | target | ||
) |
Target must be a valid area of memory. Note that the strides in the iterators can be different, so that we can for example copy data between different kinds of subvectors.
Definition at line 445 of file matpackI.cc.
Referenced by Matrix::Matrix(), MatrixView::operator=(), VectorView::operator=(), Matrix::operator=(), and Vector::Vector().
void copy | ( | ConstIterator2D | origin, |
const ConstIterator2D & | end, | ||
Iterator2D | target | ||
) |
Copy data between begin and end to target.
Target must be a valid area of memory. Note that the strides in the iterators can be different, so that we can for example copy data between different kinds of subvectors.
Origin, end, and target are 2D iterators, marking rows in a matrix. For each row the 1D iterator is obtained and used to copy the elements.
Definition at line 874 of file matpackI.cc.
References VectorView::begin(), ConstVectorView::begin(), and ConstVectorView::end().
void copy | ( | Numeric | x, |
Iterator1D | target, | ||
const Iterator1D & | end | ||
) |
Copy a scalar to all elements.
Definition at line 299 of file matpackI.cc.
void copy | ( | Numeric | x, |
Iterator2D | target, | ||
const Iterator2D & | end | ||
) |
Copy a scalar to all elements.
Definition at line 886 of file matpackI.cc.
void cross3 | ( | VectorView | c, |
const ConstVectorView & | a, | ||
const ConstVectorView & | b | ||
) |
cross3
Calculates the cross product between two vectors of length 3.
c = a x b, for 3D vectors. The vector c must have length 3 and can not be the same variable as a or b.
param c Out: The cross product vector
a | In: A vector of length 3. |
b | In: A vector of length 3. |
Definition at line 1350 of file matpackI.cc.
References a, ARTS_ASSERT, b, and c.
Referenced by MCAntenna::draw_los(), and specular_losCalc().
Numeric debug_matrixview_get_elem | ( | MatrixView & | mv, |
Index | r, | ||
Index | c | ||
) |
Helper function to access matrix elements.
Because of function inlining the operator() is not accessible from the debuggger. This function helps to access Matrix elements from within the debugger.
mv | MatrixView |
r | Row index |
c | Column index |
Definition at line 1648 of file matpackI.cc.
References c.
Numeric max | ( | const ConstMatrixView & | x | ) |
Max function, matrix version.
Definition at line 1493 of file matpackI.cc.
References ConstVectorView::begin(), ConstVectorView::end(), and max().
Numeric max | ( | const ConstVectorView & | x | ) |
Numeric mean | ( | const ConstMatrixView & | x | ) |
Mean function, matrix version.
Definition at line 1586 of file matpackI.cc.
References ConstVectorView::begin(), ConstVectorView::end(), and mean().
Numeric mean | ( | const ConstVectorView & | x | ) |
Mean function, vector version.
Definition at line 1546 of file matpackI.cc.
References mean().
Referenced by mean().
Numeric min | ( | const ConstMatrixView & | x | ) |
Min function, matrix version.
Definition at line 1527 of file matpackI.cc.
References ConstVectorView::begin(), ConstVectorView::end(), and min().
Numeric min | ( | const ConstVectorView & | x | ) |
void mult | ( | MatrixView | A, |
const ConstMatrixView & | B, | ||
const ConstMatrixView & | C | ||
) |
Matrix-Matrix Multiplication.
Performs the matrix multiplication A = B * C. The dimensions must match, i.e. A must be a m times n matrix, B a m times k matrix and C a k times c matrix. No memory reallocation takes place, only the data is copied. Using this function on overlapping MatrixViews belonging to the same Matrix will lead to unpredictable results. In particular, this means that A and B must not be the same matrix!
If the memory layout allows it, the multiplication is performed using BLAS' _dgemm, which leads to a significant speed up of the operation. To be compatible with BLAS the matrix views A, B and C must satisfy:
That means that A and B can be ConstMatrixView objects corresponding to transposed/non-transposed submatrices of a matrix, that are continuous along their first/second dimension. C must correspond to a non-transposed submatrix of a matrix, that is continuous along its second dimension.
[in,out] | A | The matrix A, that will hold the result of the multiplication. |
[in] | B | The matrix B |
[in] | C | The matrix C |
Definition at line 1137 of file matpackI.cc.
void mult | ( | VectorView | y, |
const ConstMatrixView & | M, | ||
const ConstVectorView & | x | ||
) |
Matrix-Vector Multiplication.
Computes the Matrix-Vector product y = M * x, for a m times n matrix M, a length-m vector y and a length-n vector x.
The product is computed using the dgemv_ routine from the BLAS library if the matrix is contiguous in memory. If this is not the case, the mult_general method is used to compute the product.
No memory is allocated for the computation and the matrix and vector views may not overlap.
[out] | y | The length-m VectorView where the result is stored. |
[in] | M | Reference to the m-times-n ConstMatrixView holding the matrix M. |
[in] | x | Reference to the length-n ConstVectorView holding the vector x. |
Definition at line 604 of file matpackI.cc.
void mult_general | ( | MatrixView | A, |
const ConstMatrixView & | B, | ||
const ConstMatrixView & | C | ||
) |
General matrix multiplication.
This is the fallback matrix multiplication which works for all ConstMatrixView objects.
[in,out] | A | The matrix A, that will hold the result of the multiplication. |
[in] | B | The matrix B |
[in] | C | The matrix C |
Definition at line 1143 of file matpackI.cc.
Numeric nanmean | ( | const ConstVectorView & | x | ) |
Mean function, vector version ignoring nans and infs.
Definition at line 1561 of file matpackI.cc.
References nanmean().
Referenced by Raw::Reduce::nanfocus(), and nanmean().
Numeric operator* | ( | const ConstVectorView & | a, |
const ConstVectorView & | b | ||
) |
void proj | ( | Vector & | c, |
ConstVectorView | a, | ||
ConstVectorView | b | ||
) |
Calculates the projection of two vectors of equal length.
c = proj_a(b). Projecting b on a. The vector c must have the same length but can not be the same variable as a or b.
c | Out: The projection of b on a. |
a | In: A vector of length N. |
b | In: A vector of length N. |
Definition at line 1393 of file matpackI.cc.
References a, ARTS_ASSERT, b, and c.
void transform | ( | MatrixView | y, |
double(&)(double) | my_func, | ||
ConstMatrixView | x | ||
) |
A generic transform function for matrices, which can be used to implement mathematical functions operating on all elements.
Because we have this, we don't need explicit functions like sqrt for matrices! The type of the mathematical function is double (&my_func)(double). Numeric would not work here, since mathematical functions for float do not exist!
transform(y,sin,x) computes y = sin(x)
This function can also be used for Vectors, because there is a conversion to MatrixView.
The two Matrix views may be the same one, in which case the conversion happens in place.
y | Output: The results of the function acting on each element of x. |
my_func | A function (e.g., sqrt). |
x | A matrix. |
Definition at line 1461 of file matpackI.cc.
References ARTS_ASSERT, VectorView::begin(), MatrixView::begin(), ConstVectorView::begin(), ConstMatrixView::begin(), ConstVectorView::end(), ConstMatrixView::end(), ConstMatrixView::ncols(), and ConstMatrixView::nrows().
void transform | ( | VectorView | y, |
double(&)(double) | my_func, | ||
ConstVectorView | x | ||
) |
A generic transform function for vectors, which can be used to implement mathematical functions operating on all elements.
Because we have this, we don't need explicit functions like sqrt for matrices! The type of the mathematical function is double (&my_func)(double). Numeric would not work here, since mathematical functions for float do not exist!
transform(y,sin,x) computes y = sin(x)
Although the matrix version of this can also be used for vectors, thanks to the automatic interpretation of a vector as a one column matrix, this one is slightly more efficient. However, the difference is very small (only a few percent).
The two views may be the same one, in which case the conversion happens in place.
y | Output: The results of the function acting on each element of x. |
my_func | A function (e.g., sqrt). |
x | A vector. |
Definition at line 1433 of file matpackI.cc.
References ARTS_ASSERT, VectorView::begin(), ConstVectorView::begin(), ConstVectorView::end(), and ConstVectorView::nelem().
Referenced by GasAbsLookup::Adapt(), asymmetry_parameter(), chk_interpolation_pgrids(), chk_interpolation_pgrids_loose_no_data_check(), itw2p(), p2gridpos(), ppvar_optical_depthFromPpvar_trans_cumulat(), RadarOnionPeelingTableCalc(), test2(), test31(), test6(), test7(), and VectorLogSpace().
ConstMatrixView transpose | ( | ConstMatrixView | m | ) |
Const version of transpose.
Definition at line 1134 of file matpackI.cc.
MatrixView transpose | ( | MatrixView | m | ) |
Returns the transpose.
This creates a special MatrixView for the transpose. The original is not changed!
Definition at line 1263 of file matpackI.cc.
Numeric vector_angle | ( | ConstVectorView | a, |
ConstVectorView | b | ||
) |
Returns numeric angle between two vectors in degrees.
a | In: A vector of length N. |
b | In: A vector of length N. |
Definition at line 1371 of file matpackI.cc.
References a, ARTS_ASSERT, b, RAD2DEG, and sqrt().
|
extern |
Referenced by Range::operator()().