|
HILA
|
The main \( n \times m \) matrix type template Matrix_t. This is a base class type for "useful" types which are derived from this. More...
#include <matrix.h>
Public Member Functions | |
| auto | abs () const |
| Returns absolute value of Matrix. | |
| template<typename Rtype = typename std::conditional<n == m, Mtype, Matrix<m, n, T>>::type> | |
| Rtype | adjoint () const |
| Adjoint of matrix. | |
| const Array< n, m, T > & | asArray () const |
| Cast Matrix to Array. | |
| template<int mm = m, std::enable_if_t< mm==1, int > = 0> | |
| const DiagonalMatrix< n, T > & | asDiagonalMatrix () const |
| Cast Vector to DiagonalMatrix. | |
| Vector< n, T > | column (int c) const |
| Returns column vector as value at index c. | |
| Mtype | conj () const |
| Returns complex conjugate of Matrix. | |
| template<typename Rtype = typename std::conditional<n == m, Mtype, Matrix<m, n, T>>::type> | |
| Rtype | dagger () const |
| Hermitian conjugate of matrix. | |
| T | det () const |
| determinant function - if matrix size is < 5, use Laplace, otherwise LU | |
| T | det_laplace () const |
| Determinant of matrix, using Laplace method. | |
| T | det_lu () const |
| following calculate the determinant of a square matrix det() is the generic interface, using laplace for small matrices and LU for large | |
| DiagonalMatrix< n, T > | diagonal () |
| Return diagonal of square matrix. | |
| template<int p, int q, typename S , typename R = hila::type_mul<T, S>> | |
| R | dot (const Matrix< p, q, S > &rhs) const |
| Dot product. | |
| template<int q = n, int p = m, std::enable_if_t<(q==1||p==1), int > = 0> | |
| T | e (const int i) const |
| Standard array indexing operation for vectors. | |
| T | e (const int i, const int j) const |
| Standard array indexing operation for matrices. | |
| template<typename Et , typename Mt , typename MT > | |
| int | eigen_hermitean (DiagonalMatrix< n, Et > &eigenvalues, Matrix_t< n, n, Mt, MT > &eigenvectors, enum hila::sort sorted=hila::sort::unsorted) const |
| Calculate eigenvalues and -vectors of an hermitean (or symmetric) matrix. | |
| eigen_result< Mtype > | eigen_hermitean (enum hila::sort sorted=hila::sort::unsorted) const |
| eigenvalues and -vectors of hermitean/symmetric matrix, alternative interface | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, S >::value, int > = 0> | |
| const auto & | fill (const S rhs) |
| Matrix fill. | |
| Mtype & | gaussian_random (base_type width=1.0) |
| Fills Matrix with gaussian random elements from gaussian distribution. | |
| Matrix< n, m, hila::arithmetic_type< T > > | imag () const |
| Returns imaginary part of Matrix or Vector. | |
| Matrix_t ()=default | |
| Define default constructors to ensure std::is_trivial. | |
| template<typename S = T, std::enable_if_t< hila::is_arithmetic< S >::value, int > = 0> | |
| T | max () const |
| Find max of Matrix only for arithmetic types. | |
| template<typename S = T, std::enable_if_t< hila::is_arithmetic< S >::value, int > = 0> | |
| T | min () const |
| Find min of Matrix only for arithmetic types. | |
| template<int p, int q, typename S , typename MT > | |
| hila::type_mul< T, S > | mul_trace (const Matrix_t< p, q, S, MT > &rm) const |
| Multiply with given matrix and compute trace of result. | |
| template<typename R , typename Mt > | |
| void | mult_by_2x2_left (int p, int q, const Matrix_t< 2, 2, R, Mt > &M) |
| Multiply \( n \times m \)-matrix from the left by \( n \times m \) matrix defined by \( 2 \times 2 \) sub matrix. | |
| template<typename R , typename Mt > | |
| void | mult_by_2x2_right (int p, int q, const Matrix_t< 2, 2, R, Mt > &M) |
| Multiply \( n \times m \)-matrix from the right by \( n \times m \) matrix defined by \( 2 \times 2 \) sub matrix. | |
| template<typename S = T, std::enable_if_t< hila::is_floating_point< hila::arithmetic_type< S > >::value, int > = 0> | |
| hila::arithmetic_type< T > | norm () const |
| Calculate vector norm - sqrt of squarenorm. | |
| template<typename S > | |
| bool | operator!= (const Matrix< n, m, S > &rhs) const |
| Boolean operator != to check if matrices are exactly different. | |
| template<int m, int n, typename T1 , typename T2 , typename Rt = hila::ntype_op<T1, T2>> | |
| Rt | operator* (const Matrix< 1, m, T1 > &A, const Matrix< n, 1, T2 > &B) |
| Multiplication operator RowVector * Vector. | |
| template<typename Mt , typename S , std::enable_if_t<(Mt::is_matrix() &&hila::is_complex_or_arithmetic< S >::value), int > = 0, typename Rt = hila::mat_scalar_type<Mt, S>> | |
| Rt | operator* (const Mt &mat, const S &rhs) |
| Multiplication operator Matrix * scalar. | |
| template<typename Mt1 , typename Mt2 , std::enable_if_t< Mt1::is_matrix() &&Mt2::is_matrix() &&!std::is_same< Mt1, Mt2 >::value, int > = 0, typename R = hila::type_mul<hila::number_type<Mt1>, hila::number_type<Mt2>>, int n = Mt1::rows(), int m = Mt2::columns()> | |
| Matrix< n, m, R > | operator* (const Mt1 &a, const Mt2 &b) |
| Multiplication operator. | |
| template<typename Mt , typename S , std::enable_if_t<(Mt::is_matrix() &&hila::is_complex_or_arithmetic< S >::value), int > = 0, typename Rt = hila::mat_scalar_type<Mt, S>> | |
| Rt | operator* (const S &rhs, const Mt &mat) |
| Multiplication operator Scalar * Matrix. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, hila::type_mul< T, S > >::value, int > = 0> | |
| auto & | operator*= (const DiagonalMatrix< m, S > &rhs) & |
| Multiply assign operator for DiagonalMatrix to Matrix. | |
| template<int p, typename S , typename MT , std::enable_if_t< hila::is_assignable< T &, hila::type_mul< T, S > >::value, int > = 0> | |
| auto & | operator*= (const Matrix_t< m, p, S, MT > &rhs) & |
| Multiply assign scalar or matrix. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, hila::type_mul< T, S > >::value, int > = 0> | |
| auto & | operator*= (const S rhs) & |
| Multiply assign operator scalar to Matrix. | |
| const auto & | operator+ () const |
| Addition operator. | |
| template<typename Mtype , typename S , std::enable_if_t< Mtype::is_matrix() &&hila::is_complex_or_arithmetic< S >::value, int > = 0, typename Rtype = hila::mat_scalar_type<Mtype, S>> | |
| Rtype | operator+ (const Mtype &a, const S &b) |
| Addition operator Matrix + scalar. | |
| template<typename Mtype1 , typename Mtype2 , std::enable_if_t< Mtype1::is_matrix() &&Mtype2::is_matrix(), int > = 0, typename Rtype = hila::mat_x_mat_type<Mtype1, Mtype2>, std::enable_if_t<!std::is_same< Mtype1, Rtype >::value, int > = 0> | |
| Rtype | operator+ (const Mtype1 &a, const Mtype2 &b) |
| Addition operator Matrix + Matrix. | |
| template<typename Mtype , typename S , std::enable_if_t< Mtype::is_matrix() &&hila::is_complex_or_arithmetic< S >::value, int > = 0, typename Rtype = hila::mat_scalar_type<Mtype, S>> | |
| Rtype | operator+ (const S &b, const Mtype &a) |
| Addition operator scalar + Matrix. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, hila::type_plus< T, S > >::value, int > = 0> | |
| auto & | operator+= (const DiagonalMatrix< n, S > &rhs) & |
| Addition assign operator for DiagonalMatrix to Matrix. | |
| template<typename S , typename MT , std::enable_if_t< hila::is_assignable< T &, S >::value, int > = 0> | |
| auto & | operator+= (const Matrix_t< n, m, S, MT > &rhs) & |
| Add assign operator Matrix to Matrix. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, hila::type_plus< T, S > >::value, int > = 0> | |
| auto & | operator+= (const S &rhs) & |
| Add assign operator scalar to Matrix. | |
| Mtype | operator- () const |
| Unary operator. | |
| template<typename Mtype , typename S , std::enable_if_t< Mtype::is_matrix() &&hila::is_complex_or_arithmetic< S >::value, int > = 0, typename Rtype = hila::mat_scalar_type<Mtype, S>> | |
| Rtype | operator- (const Mtype &a, const S &b) |
| Subtraction operator Matrix - scalar. | |
| template<typename Mtype1 , typename Mtype2 , std::enable_if_t< Mtype1::is_matrix() &&Mtype2::is_matrix(), int > = 0, typename Rtype = hila::mat_x_mat_type<Mtype1, Mtype2>> | |
| Rtype | operator- (const Mtype1 &a, const Mtype2 &b) |
| Subtraction operator Matrix - Matrix. | |
| template<typename Mtype , typename S , std::enable_if_t< Mtype::is_matrix() &&hila::is_complex_or_arithmetic< S >::value, int > = 0, typename Rtype = hila::mat_scalar_type<Mtype, S>> | |
| Rtype | operator- (const S &b, const Mtype &a) |
| Subtraction operator Scalar - Matrix. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, hila::type_plus< T, S > >::value, int > = 0> | |
| auto & | operator-= (const DiagonalMatrix< n, S > &rhs) & |
| Subtract assign operator for DiagonalMatrix to Matrix. | |
| template<typename S , typename MT , std::enable_if_t< hila::is_assignable< T &, S >::value, int > = 0> | |
| auto & | operator-= (const Matrix_t< n, m, S, MT > &rhs) & |
| Subtract assign operator Matrix to MAtrix. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, hila::type_minus< T, S > >::value, int > = 0> | |
| auto & | operator-= (const S rhs) & |
| Subtract assign operator scalar to Matrix. | |
| template<typename Mt , typename S , std::enable_if_t<(Mt::is_matrix() &&hila::is_complex_or_arithmetic< S >::value), int > = 0, typename Rt = hila::mat_scalar_type<Mt, S>> | |
| Rt | operator/ (const Mt &mat, const S &rhs) |
| Division operator. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, hila::type_div< T, S > >::value, int > = 0> | |
| auto & | operator/= (const DiagonalMatrix< m, S > &rhs) & |
| Divide assign operator for DiagonalMatrix to Matrix. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, hila::type_div< T, S > >::value, int > = 0> | |
| auto & | operator/= (const S rhs) & |
| Divide assign oprator scalar with matrix. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, S >::value, int > = 0> | |
| auto & | operator= (const DiagonalMatrix< n, S > &rhs) & |
| Assignment from diagonal matrix. | |
| template<typename S , typename MT , std::enable_if_t< hila::is_assignable< T &, S >::value, int > = 0> | |
| auto & | operator= (const Matrix_t< n, m, S, MT > &rhs) & |
| Copy matrix assignment. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, S >::value &&n==m, int > = 0> | |
| auto & | operator= (const S rhs) & |
| Assignment from scalar. | |
| Mtype & | operator= (const std::nullptr_t &z) |
| Zero assignment. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, S >::value, int > = 0> | |
| auto & | operator= (std::initializer_list< S > rhs) & |
| Initializer list assignment. | |
| template<typename S , int n2, int m2> | |
| bool | operator== (const Matrix< n2, m2, S > &rhs) const |
| Boolean operator == to determine if two matrices are exactly the same. | |
| template<int q = n, int p = m, std::enable_if_t<(q==1||p==1), int > = 0> | |
| T | operator[] (const int i) const |
| Indexing operation [] defined only for vectors. | |
| template<int p, int q, typename S , typename R = hila::type_mul<T, S>> | |
| Matrix< n, p, R > | outer_product (const Matrix< p, q, S > &rhs) const |
| Outer product. | |
| template<int N> | |
| Mtype | permute (const Vector< N, int > &permutation) const |
| Permute elements of vector. | |
| Mtype | permute_columns (const Vector< m, int > &permutation) const |
| permute columns of Matrix | |
| Mtype | permute_rows (const Vector< n, int > &permutation) const |
| permute rows of Matrix | |
| Mtype & | random () |
| dot with matrix - matrix | |
| Matrix< n, m, hila::arithmetic_type< T > > | real () const |
| Returns real part of Matrix or Vector. | |
| RowVector< m, T > | row (int r) const |
| Return reference to row in a matrix. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, S >::value, int > = 0> | |
| void | set_column (int c, const Vector< n, S > &v) |
| get column of a matrix | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, S >::value, int > = 0> | |
| void | set_diagonal (const Vector< n, S > &v) |
| Set diagonal of square matrix to Vector which is passed to the method. | |
| template<typename S , std::enable_if_t< hila::is_assignable< T &, S >::value, int > = 0> | |
| void | set_row (int r, const RowVector< m, S > &v) |
| Set row of Matrix with RowVector if types are assignable. | |
| Mtype | sort (hila::sort order=hila::sort::ascending) const |
| Sort method for Vector. | |
| template<int N> | |
| Mtype | sort (Vector< N, int > &permutation, hila::sort order=hila::sort::ascending) const |
| Sort method for Vector which returns permutation order. | |
| hila::arithmetic_type< T > | squarenorm () const |
| Calculate square norm - sum of squared elements. | |
| std::string | str (int prec=8, char separator=' ') const |
| svd_result< Mtype > | svd (enum hila::sort sorted=hila::sort::unsorted) const |
| svd and svd_pivot - alternative interface | |
| template<typename Et , typename Mt , typename MT > | |
| int | svd (Matrix_t< n, n, Mt, MT > &_U, DiagonalMatrix< n, Et > &_D, Matrix_t< n, n, Mt, MT > &_V, enum hila::sort sorted=hila::sort::unsorted) const |
| Singular value decomposition: divide matrix A = U S V*, where U,V unitary and S diagonal matrix of real singular values. Unpivoted Jacobi rotations. | |
| template<typename Et , typename Mt , typename MT > | |
| int | svd_pivot (Matrix_t< n, n, Mt, MT > &_U, DiagonalMatrix< n, Et > &_D, Matrix_t< n, n, Mt, MT > &_V, enum hila::sort sorted=hila::sort::unsorted) const |
| Singular value decomposition: divide matrix A = U S V*, where U,V unitary and S diagonal matrix of real singular values. Fully pivoted Jacobi rotations. | |
| T | trace () const |
| Computes Trace for Matrix. | |
| template<int mm = m, typename Rtype = typename std::conditional<n == m, Matrix_t, Matrix<m, n, T>>::type, std::enable_if_t<(mm !=1 &&n !=1), int > = 0> | |
| Rtype | transpose () const |
| Transpose of matrix. | |
| template<int mm = m, std::enable_if_t< mm==1, int > = 0> | |
| const RowVector< n, T > & | transpose () const |
| Transpose of vector. | |
| template<int nn = n, std::enable_if_t< nn==1 &&m !=1, int > = 0> | |
| const Vector< m, T > & | transpose () const |
| Transpose of RowVector. | |
Static Public Member Functions | |
| static constexpr int | columns () |
| Returns column length. | |
| static constexpr bool | is_square () |
| Returns true if matrix is a square matrix. | |
| static constexpr bool | is_vector () |
| Returns true if Matrix is a vector. | |
| static constexpr int | rows () |
| Define constant methods rows(), columns() - may be useful in template code. | |
| template<int q = n, int p = m, std::enable_if_t< q==1, int > = 0> | |
| static constexpr int | size () |
| Returns size of Vector or square Matrix. | |
Public Attributes | |
| T | c [n *m] |
| The data as a one dimensional array. | |
The main \( n \times m \) matrix type template Matrix_t. This is a base class type for "useful" types which are derived from this.
Uses curiously recurring template pattern (CRTP), where the last template parameter is the template itself
Example: the Matrix type below is defined as
This pattern is used because stupid c++ makes it complicated to write generic code, in this case derived functions to return derived type
| n | Number of rows |
| m | Number of columns |
| T | Matrix element type |
| Mtype | Specific "Matrix" type for CRTP |
|
inline |
|
inline |
Returns column vector as value at index c.
| c | index of column vector to be returned |
Determinant of matrix, using Laplace method.
Defined only for square matrices
For perfomance overloads exist for \( 1 \times 1 \), \( 2 \times 2 \) and \( 3 \times 3 \) matrices.
| mat | matrix to compute determinant for |
Definition at line 637 of file matrix_linalg.h.
following calculate the determinant of a square matrix det() is the generic interface, using laplace for small matrices and LU for large
Matrix determinant with LU decomposition.
Algorithm: numerical Recipes, 2nd ed. p. 47 ff Works for Real and Complex matrices Defined only for square matrices
Definition at line 677 of file matrix_linalg.h.
|
inline |
Return diagonal of square matrix.
If called for non square matrix the program will throw an error.
|
inline |
Dot product.
Only works between two Vector objects
| p | Row length for rhs |
| q | Column length for rhs |
| S | Type for rhs |
| R | Gives resulting type of lhs and rhs multiplication |
| rhs | Vector to compute dot product with |
|
inline |
Standard array indexing operation for vectors.
Accessing singular elements is insufficient, but Vector elements are often quite small.
| q | Number of rows |
| p | Number of columns |
| i | Index |
|
inline |
Standard array indexing operation for matrices.
Accessing singular elements is insufficient, but Matrix elements are often quite small.
Exammple for matrix:
| i | Row index |
| j | Column index |
| int Matrix_t< n, m, T, Mtype >::eigen_hermitean | ( | DiagonalMatrix< n, Et > & | E, |
| Matrix_t< n, n, Mt, MT > & | U, | ||
| enum hila::sort | sorted = hila::sort::unsorted |
||
| ) | const |
Calculate eigenvalues and -vectors of an hermitean (or symmetric) matrix.
Calculate eigenvalues and vectors of an hermitean or real symmetric matrix.
Returns the number of Jacobi iterations, or -1 if did not converge. Arguments will contain eigenvalues and eigenvectors in columns of the "eigenvectors" matrix. Computation is done in double precision despite the input matrix types.
| eigenvaluevec | Vector of computed eigenvalue |
| eigenvectors | Eigenvectors as columns of \( n \times n \) Matrix |
Algorithm uses fully pivoted Jacobi rotations.
Two interfaces:
H.eigen_hermitean(E, U, [optional: sort]); E: output is DiagnoalMatrix containing real eigenvalues U: nxn unitary matrix, columns are normalized eigenvectors
auto res = H.eigen_hermitean([optional: sort]); This saves the trouble of defining E and U (see below)
Thus, H = U E U^* and H U = U E
Both interfaces allow optional sorting according to eigenvalues: hila::sort::unsorted [default] hila::sort::ascending / descending
Example:
| E | diagonal matrix of real eigenvalues |
| U | Unitary nxn matrix of eigenvectors |
| sorted | sorting of eigenvalues (default:unsorted) |
Definition at line 200 of file matrix_linalg.h.
| eigen_result< Mtype > Matrix_t< n, m, T, Mtype >::eigen_hermitean | ( | enum hila::sort | sorted = hila::sort::unsorted | ) | const |
eigenvalues and -vectors of hermitean/symmetric matrix, alternative interface
result = eigen_hermitean(hila::sort [optional]) returns struct eigen_result<Mtype>, with fields eigenvalues: DiagonalMatrix of eigenvalues eigenvectors: nxn unitary matrix of eigenvectors
Example:
This interface saves the trouble of defining the eigenvalue and -vector variables.
Definition at line 306 of file matrix_linalg.h.
|
inline |
Matrix fill.
Fills the matrix with element if it is assignable to matrix type T
Works as follows:
| S | Scalar type to of rhs |
| rhs | Element to fill matrix with |
|
inline |
Fills Matrix with gaussian random elements from gaussian distribution.
| width |
|
inline |
Multiply with given matrix and compute trace of result.
Slightly cheaper operation than
| p | |
| q | |
| S | |
| MT |
| rm |
|
inline |
Multiply \( n \times m \)-matrix from the left by \( n \times m \) matrix defined by \( 2 \times 2 \) sub matrix.
The multiplication is defined as follows, let \(M\) as the \( 2 \times 2 \) input matrix and \(B\) be (this) matrix, being the matrix stored in the object this method is called for. Let \(A = I\) be a \( n \times m \) unit matrix. We then set the values of A to be:
\begin{align} A_{p,p} = M_{0,0}, \hspace{5px} A_{p,q} = M_{0,1}, \hspace{5px} A_{q,p} = M_{1,0}, \hspace{5px} A_{q,q} = M_{1,1}. \end{align}
Then the resulting matrix will be:
\begin{align} B = A \cdot B \end{align}
| R | Element type of M |
| Mt | Matrix type of M |
| p | First row and column |
| q | Second row and column |
| M | \( 2 \times 2\) Matrix to multiply with |
|
inline |
Multiply \( n \times m \)-matrix from the right by \( n \times m \) matrix defined by \( 2 \times 2 \) sub matrix.
See Matrix::mult_by_2x2_left, only difference being that the multiplication is from the right.
| R | Element type of M |
| Mt | Matrix type of M |
| p | First row and column |
| q | Second row and column |
| M | \( 2 \times 2\) Matrix to multiply with |
|
inline |
Boolean operator != to check if matrices are exactly different.
if matrices are exactly the same then this will return false
| S | Type for MAtrix which is being compared to |
| rhs | right hand side Matrix which we are comparing |
| Rt operator* | ( | const Matrix< 1, m, T1 > & | A, |
| const Matrix< n, 1, T2 > & | B | ||
| ) |
Multiplication operator RowVector * Vector.
Defined as standard dot product between vectors as long as vectors are of same length
| m | Dimensions of RowVector |
| n | Dimension of Vector |
| T1 | Element type of RowVector |
| T2 | Element type of Vector |
| Rt | Return type of T1 \( \cdot \) T2 product |
| A | RowVector to multiply |
| B | Vector to multiply |
|
inline |
|
inline |
Multiplication operator.
Multiplication type depends on the original types of the multiplied matrices. Defined for the following operations.
Standard matrix multiplication where LHS columns must match RHS rows
Vector * RowVector is same as outer product which is equivalent to a matrix multiplication
|
inline |
|
inline |
Multiply assign operator for DiagonalMatrix to Matrix.
Simply defined as matrix multiplication, but since rhs is guaranteed to be diagonal the method is optimized to skip most of the elements.
| S | Element type of rhs |
| rhs | DiagonalMatrix to multiply |
|
inline |
Multiply assign scalar or matrix.
Multiplication works as defined for matrix multiplication
Matrix multiply assign only defined for square matrices, since the matrix dimensions would change otherwise.
| rhs | Matrix to multiply with |
|
inline |
|
inline |
|
inline |
Addition operator Matrix + scalar.
Addition operator between matrix and scalar is defined in the usual way, where the scalar is added to the diagonal elements.
| Mtype | Matrix type of b |
| S | Type of scalar |
| a | Matrix to add to |
| b | Scalar to add |
|
inline |
|
inline |
Addition operator scalar + Matrix.
Addition operator between Scalar and Matrix is defined in the usual way, where the scalar is treated as diagonal matrix which is then added to. \( 2 + M = 2\cdot\mathbb{1} + M \)
| Mtype | Matrix type of a |
| S | scalar type of b |
| b | Matrix to add |
| a | Scalar to add to |
|
inline |
Addition assign operator for DiagonalMatrix to Matrix.
Works as long as Matrix to assign to is square
| S | Element type of rhs |
| rhs | DiagonalMatrix to add |
|
inline |
|
inline |
Add assign operator scalar to Matrix.
Adds scalar \( a \) to square matrix as \( M + a\cdot\mathbb{1} \)
| S | Element type of scalar rhs |
| rhs | Sclar to add |
|
inline |
Subtraction operator Matrix - scalar.
Subtraction operator between matrix and scalar is defined in the usual way, where the scalar is subtracted from the diagonal elements.
\( M - 2 = M - 2\cdot\mathbb{1} \)
| Mtype | Matrix type of a |
| S | Scalar type of b |
| a | Matrix to subtract from |
| b | Scalar to subtract |
|
inline |
|
inline |
Subtraction operator Scalar - Matrix.
Subtraction operator between Scalar and Matrix is defined in the usual way, where the scalar is treated as diagonal matrix which is then subtracted from.
\( 2 - M = 2\cdot\mathbb{1} - M \)
| Mtype | Matrix type a |
| S | Scalar type of b |
| b | Scalar to subtract from |
| a | Matrix to subtract |
|
inline |
Subtract assign operator for DiagonalMatrix to Matrix.
Works as long as Matrix to assign to is square
| S | Element type of rhs |
| rhs | DiagonalMatrix to add |
|
inline |
Subtract assign operator scalar to Matrix.
Subtract scalar \( a \) to square matrix as \( M - a\cdot\mathbb{1} \)
| S | Element type of scalar rhs |
| rhs | scalar to add |
|
inline |
|
inline |
Divide assign operator for DiagonalMatrix to Matrix.
Well defined since rhs is guaranteed to be Diagonal.
Let M be the Matrix which we divide and D be the DiagonalMatrix which we divide with then the operation is defined as \( M \cdot D^{-1} \).
| S | Element type of rhs |
| rhs | DiagonalMatrix to divide |
|
inline |
Divide assign oprator scalar with matrix.
Divide works as defined for scalar matrix division.
| S | Scalar type of rhs |
| rhs | Scalar to divide with |
|
inline |
|
inline |
Copy matrix assignment.
| rhs | Matrix to assign |
|
inline |
Assignment from scalar.
Assigns the scalar to the diagonal elements as \( M = I\cdot a\)
| S | Scalar type to assign |
| rhs | Scalar to assign |
|
inline |
Zero assignment.
| z | 0 |
|
inline |
Initializer list assignment.
| S | Element type of initializer list |
| rhs | Initializer list to assign |
|
inline |
|
inline |
Indexing operation [] defined only for vectors.
Example:
| q | row size n |
| p | column size m |
| i | row or vector index depending on which is being indexed |
|
inline |
Outer product.
Only works between two Vector objects
| p | Row length for rhs |
| q | Column length for rhs |
| S | Element type for rhs |
| R | Type between lhs and rhs multiplication |
| rhs | Vector to compute outer product with |
|
inline |
|
inline |
Return reference to row in a matrix.
Since the Matrix data is ordered in a row major order accessing a row returns a reference to the row.
| r | index of row to be referenced |
|
inline |
get column of a matrix
Set column of Matrix with Vector if types are assignable
| S | Vector type |
| c | Index of column to be set |
| v | Vector to be set |
|
inline |
Set diagonal of square matrix to Vector which is passed to the method.
If called for non square matrix the program will throw an error.
Example:
| S | type vector to assign values to |
| v | Vector to assign to diagonal |
|
inline |
Set row of Matrix with RowVector if types are assignable.
| S | RowVector type |
| r | Index of row to be set |
| v | RowVector to be set |
|
inline |
Sort method for Vector.
Order can be past as argument as either ascending (default) or descending
Ascending
Descending
| order | Order to sort in |
|
inline |
Sort method for Vector which returns permutation order.
Order can be past as argument as either ascending (default) or descending
Ascending
Descending
| N |
| permutation | |
| order |
| svd_result< Mtype > Matrix_t< n, m, T, Mtype >::svd | ( | enum hila::sort | sorted = hila::sort::unsorted | ) | const |
svd and svd_pivot - alternative interface
svd(hila::sort [optional]) returns struct svd_result<Mtype>, with fields U: nxn unitary matrix singularvalues: DiagonalMatrix of singular values (real, > 0) V: nxn unitary matrix
auto res = M.svd(); now res.U : nxn unitary res.singularvalues : DiagonalMatrix of singular values res.V : nxn unitary
result satifies M = res.U res.singularvalues res.V.dagger()
Definition at line 577 of file matrix_linalg.h.
| int Matrix_t< n, m, T, Mtype >::svd | ( | Matrix_t< n, n, Mt, MT > & | _U, |
| DiagonalMatrix< n, Et > & | _S, | ||
| Matrix_t< n, n, Mt, MT > & | _V, | ||
| enum hila::sort | sorted = hila::sort::unsorted |
||
| ) | const |
Singular value decomposition: divide matrix A = U S V*, where U,V unitary and S diagonal matrix of real singular values. Unpivoted Jacobi rotations.
Unpivoted rotation is generally faster than pivoted (esp. on gpu), but a bit less accurate
Use: M.svd(U, S, V, [sorted]);
Result satisfies M = U S V.dagger()
The algorithm works by one-sided Jacobi rotations.
Definition at line 469 of file matrix_linalg.h.
| int Matrix_t< n, m, T, Mtype >::svd_pivot | ( | Matrix_t< n, n, Mt, MT > & | _U, |
| DiagonalMatrix< n, Et > & | _S, | ||
| Matrix_t< n, n, Mt, MT > & | _V, | ||
| enum hila::sort | sorted = hila::sort::unsorted |
||
| ) | const |
Singular value decomposition: divide matrix A = U S V*, where U,V unitary and S diagonal matrix of real singular values. Fully pivoted Jacobi rotations.
Use: M.svd_pivot(U, S, V, [sorted]);
The algorithm works by one-sided Jacobi rotations.
| U |
Definition at line 344 of file matrix_linalg.h.