Public Member Functions | |
LAPACKFullMatrix (const unsigned int n=0) | |
LAPACKFullMatrix (const unsigned int rows, const unsigned int cols) | |
LAPACKFullMatrix (const LAPACKFullMatrix &) | |
LAPACKFullMatrix< number > & | operator= (const LAPACKFullMatrix< number > &) |
template<typename number2 > | |
LAPACKFullMatrix< number > & | operator= (const FullMatrix< number2 > &) |
LAPACKFullMatrix< number > & | operator= (const double d) |
template<class MATRIX > | |
void | copy_from (const MATRIX &) |
template<class MATRIX > | |
void | fill (const MATRIX &src, const unsigned int dst_offset_i=0, const unsigned int dst_offset_j=0, const unsigned int src_offset_i=0, const unsigned int src_offset_j=0, const number factor=1., const bool transpose=false) |
void | vmult (Vector< number > &w, const Vector< number > &v, const bool adding=false) const |
void | vmult_add (Vector< number > &w, const Vector< number > &v) const |
void | Tvmult (Vector< number > &w, const Vector< number > &v, const bool adding=false) const |
void | Tvmult_add (Vector< number > &w, const Vector< number > &v) const |
void | compute_lu_factorization () |
void | invert () |
void | apply_lu_factorization (Vector< number > &v, const bool transposed) const |
void | compute_eigenvalues (const bool right_eigenvectors=false, const bool left_eigenvectors=false) |
std::complex< number > | eigenvalue (const unsigned int i) const |
void | print_formatted (std::ostream &out, const unsigned int presicion=3, const bool scientific=true, const unsigned int width=0, const char *zero_string=" ", const double denominator=1., const double threshold=0.) const |
Private Attributes | |
LAPACKSupport::State | state |
LAPACKSupport::Properties | properties |
std::vector< number > | work |
std::vector< int > | ipiv |
std::vector< number > | inv_work |
std::vector< number > | wr |
std::vector< number > | wi |
std::vector< number > | vl |
std::vector< number > | vr |
LAPACKFullMatrix< number >::LAPACKFullMatrix | ( | const unsigned int | n = 0 |
) | [explicit] |
Constructor. Initialize the matrix as a square matrix with dimension n
.
In order to avoid the implicit conversion of integers and other types to a matrix, this constructor is declared explicit
.
By default, no memory is allocated.
LAPACKFullMatrix< number >::LAPACKFullMatrix | ( | const unsigned int | rows, | |
const unsigned int | cols | |||
) |
Constructor. Initialize the matrix as a rectangular matrix.
LAPACKFullMatrix< number >::LAPACKFullMatrix | ( | const LAPACKFullMatrix< number > & | ) |
Copy constructor. This constructor does a deep copy of the matrix. Therefore, it poses a possible efficiency problem, if for example, function arguments are passed by value rather than by reference. Unfortunately, we can't mark this copy constructor explicit
, since that prevents the use of this class in containers, such as std::vector
. The responsibility to check performance of programs must therefore remain with the user of this class.
LAPACKFullMatrix<number>& LAPACKFullMatrix< number >::operator= | ( | const LAPACKFullMatrix< number > & | ) |
Assignment operator.
LAPACKFullMatrix<number>& LAPACKFullMatrix< number >::operator= | ( | const FullMatrix< number2 > & | ) | [inline] |
Assignment operator for a regular FullMatrix.
LAPACKFullMatrix<number>& LAPACKFullMatrix< number >::operator= | ( | const double | d | ) |
This operator assigns a scalar to a matrix. To avoid confusion with constructors, zero is the only value allowed for d
void LAPACKFullMatrix< number >::copy_from | ( | const MATRIX & | M | ) | [inline] |
Assignment from different matrix classes. This assignment operator uses iterators of the class MATRIX. Therefore, sparse matrices are possible sources.
References TransposeTable< number >::el(), LAPACKSupport::matrix, TransposeTable< number >::reinit(), and LAPACKFullMatrix< number >::state.
void LAPACKFullMatrix< number >::fill | ( | const MATRIX & | src, | |
const unsigned int | dst_offset_i = 0 , |
|||
const unsigned int | dst_offset_j = 0 , |
|||
const unsigned int | src_offset_i = 0 , |
|||
const unsigned int | src_offset_j = 0 , |
|||
const number | factor = 1. , |
|||
const bool | transpose = false | |||
) | [inline] |
Fill rectangular block.
A rectangular block of the matrix src
is copied into this
. The upper left corner of the block being copied is (src_offset_i,src_offset_j)
. The upper left corner of the copied block is (dst_offset_i,dst_offset_j)
. The size of the rectangular block being copied is the maximum size possible, determined either by the size of this
or src
.
The final two arguments allow to enter a multiple of the source or its transpose.
References LAPACKSupport::matrix, TransposeTable< number >::n_cols(), TransposeTable< number >::n_rows(), and LAPACKFullMatrix< number >::state.
void LAPACKFullMatrix< number >::vmult | ( | Vector< number > & | w, | |
const Vector< number > & | v, | |||
const bool | adding = false | |||
) | const |
Matrix-vector-multiplication.
The optional parameter adding
determines, whether the result is stored in w
or added to w
.
if (adding) w += A*v
if (!adding) w = A*v
Source and destination must not be the same vector.
void LAPACKFullMatrix< number >::vmult_add | ( | Vector< number > & | w, | |
const Vector< number > & | v | |||
) | const |
Adding Matrix-vector-multiplication. w += A*v
Source and destination must not be the same vector.
void LAPACKFullMatrix< number >::Tvmult | ( | Vector< number > & | w, | |
const Vector< number > & | v, | |||
const bool | adding = false | |||
) | const |
Transpose matrix-vector-multiplication.
The optional parameter adding
determines, whether the result is stored in w
or added to w
.
if (adding) w += AT*v
if (!adding) w = AT*v
Source and destination must not be the same vector.
void LAPACKFullMatrix< number >::Tvmult_add | ( | Vector< number > & | w, | |
const Vector< number > & | v | |||
) | const |
Adding transpose matrix-vector-multiplication. w += AT*v
Source and destination must not be the same vector.
void LAPACKFullMatrix< number >::compute_lu_factorization | ( | ) |
Compute the LU factorization of the matrix using LAPACK function Xgetrf.
void LAPACKFullMatrix< number >::invert | ( | ) |
Invert the matrix by first computing an LU factorization with the LAPACK function Xgetrf and then building the actual inverse using Xgetri.
void LAPACKFullMatrix< number >::apply_lu_factorization | ( | Vector< number > & | v, | |
const bool | transposed | |||
) | const |
Solve the linear system with right hand side given by applying forward/backward substitution to the previously computed LU factorization. Uses LAPACK function Xgetrs.
void LAPACKFullMatrix< number >::compute_eigenvalues | ( | const bool | right_eigenvectors = false , |
|
const bool | left_eigenvectors = false | |||
) |
Compute eigenvalues of the matrix. After this routine has been called, eigenvalues can be retrieved using the eigenvalue() function. The matrix itself will be LAPACKSupport::unusable after this operation.
The optional arguments allow to compute left and right eigenvectors as well.
Note that the function does not return the computed eigenvalues right away since that involves copying data around between the output arrays of the LAPACK functions and any return array. This is often unnecessary since one may not be interested in all eigenvalues at once, but for example only the extreme ones. In that case, it is cheaper to just have this function compute the eigenvalues and have a separate function that returns whatever eigenvalue is requested.
std::complex< number > LAPACKFullMatrix< number >::eigenvalue | ( | const unsigned int | i | ) | const [inline] |
Retrieve eigenvalue after compute_eigenvalues() was called.
References Assert, LAPACKSupport::eigenvalues, TransposeTable< number >::n_rows(), LAPACKFullMatrix< number >::state, LAPACKFullMatrix< number >::wi, and LAPACKFullMatrix< number >::wr.
void LAPACKFullMatrix< number >::print_formatted | ( | std::ostream & | out, | |
const unsigned int | presicion = 3 , |
|||
const bool | scientific = true , |
|||
const unsigned int | width = 0 , |
|||
const char * | zero_string = " " , |
|||
const double | denominator = 1. , |
|||
const double | threshold = 0. | |||
) | const |
Print the matrix and allow formatting of entries.
The parameters allow for a flexible setting of the output format:
precision
denotes the number of trailing digits.scientific
is used to determine the number format, where scientific
= false
means fixed point notation.width
denotes the with of each column. A zero entry for width
makes the function compute a width, but it may be changed to a positive value, if output is crude.zero_string
specifies a string printed for zero entries.denominator
Multiply the whole matrix by this common denominator to get nicer numbers.threshold
: all entries with absolute value smaller than this are considered zero.
LAPACKSupport::State LAPACKFullMatrix< number >::state [private] |
Since LAPACK operations notoriously change the meaning of the matrix entries, we record the current state after the last operation here.
Referenced by LAPACKFullMatrix< number >::copy_from(), LAPACKFullMatrix< number >::eigenvalue(), and LAPACKFullMatrix< number >::fill().
LAPACKSupport::Properties LAPACKFullMatrix< number >::properties [private] |
Additional properties of the matrix which may help to select more efficient LAPACK functions.
std::vector<number> LAPACKFullMatrix< number >::work [mutable, private] |
The working array used for some LAPACK functions.
std::vector<int> LAPACKFullMatrix< number >::ipiv [private] |
The vector storing the permutations applied for pivoting in the LU-factorization.
std::vector<number> LAPACKFullMatrix< number >::inv_work [private] |
Workspace for calculating the inverse matrix from an LU factorization.
std::vector<number> LAPACKFullMatrix< number >::wr [private] |
Real parts of eigenvalues. Filled by compute_eigenvalues.
Referenced by LAPACKFullMatrix< number >::eigenvalue().
std::vector<number> LAPACKFullMatrix< number >::wi [private] |
Imaginary parts of eigenvalues. Filled by compute_eigenvalues.
Referenced by LAPACKFullMatrix< number >::eigenvalue().
std::vector<number> LAPACKFullMatrix< number >::vl [private] |
Space where left eigenvectors can be stored.
std::vector<number> LAPACKFullMatrix< number >::vr [private] |
Space where right eigenvectors can be stored.