deal.II version GIT relicensing-2287-g6548a49e0a 2024-12-20 18:30:00+00:00
|
#include <deal.II/lac/qr.h>
Public Types | |
using | Number = typename VectorType::value_type |
Public Member Functions | |
QR () | |
virtual | ~QR ()=default |
virtual bool | append_column (const VectorType &column) |
virtual void | remove_column (const unsigned int k=0) |
virtual void | multiply_with_Q (VectorType &y, const Vector< Number > &x) const |
virtual void | multiply_with_QT (Vector< Number > &y, const VectorType &x) const |
virtual void | multiply_with_A (VectorType &y, const Vector< Number > &x) const |
virtual void | multiply_with_AT (Vector< Number > &y, const VectorType &x) const |
unsigned int | size () const |
const LAPACKFullMatrix< Number > & | get_R () const |
void | solve (Vector< Number > &x, const Vector< Number > &y, const bool transpose=false) const |
boost::signals2::connection | connect_givens_slot (const std::function< void(const unsigned int i, const unsigned int j, const std::array< Number, 3 > &csr)> &slot) |
Protected Member Functions | |
void | multiply_with_cols (VectorType &y, const Vector< Number > &x) const |
void | multiply_with_colsT (Vector< Number > &y, const VectorType &x) const |
Protected Attributes | |
std::vector< std::unique_ptr< VectorType > > | columns |
LAPACKFullMatrix< Number > | R |
unsigned int | current_size |
boost::signals2::signal< void(const unsigned int i, const unsigned int j, const std::array< Number, 3 > &)> | givens_signal |
Private Member Functions | |
void | apply_givens_rotation (const unsigned int i, const unsigned int k) |
Private Attributes | |
VectorType | tmp |
A class to compute and store the QR factorization of a matrix represented by a set of column vectors.
The class is design to update a given (possibly empty) QR factorization of a matrix \(A\) (constructed incrementally by providing its columns) due to the addition of a new column vector to \(A\). This is equivalent to constructing an orthonormal basis by the Gram-Schmidt procedure. The class also provides update functionality when the first column is removed.
The VectorType
template argument may either be a parallel and serial vector, and only need to have basic operations such as additions, scalar product, etc. It also needs to have a copy-constructor.
See sections 6.5.2-6.5.3 on pp. 335-338 in [101] as well as [69] and [186].
using QR< VectorType >::Number = typename VectorType::value_type |
|
virtual |
Append column
to the QR factorization. Returns true
if the result is successful, i.e. the columns are linearly independent. Otherwise the column
is rejected and the return value is false
.
true
. Implements BaseQR< VectorType >.
|
virtual |
Remove first column and update QR factorization.
Starting from the given QR decomposition \(QR= A = [a_1\,\dots a_n], \quad a_i \in {\mathbb R}^m\) we aim at computing factorization of \(\tilde Q \tilde R= \tilde A = [a_2\,\dots a_n], \quad a_i \in {\mathbb R}^m\).
The standard approach is to partition \(R\) as
\[ R = \begin{bmatrix} r_{11} & w^T \\ 0 & R_{33} \end{bmatrix} \]
It then follows that
\[ Q^T \tilde A = \begin{bmatrix} 0 & w^T \\ 0 & R_{33} \end{bmatrix} \]
is upper Hessenberg where unwanted sub-diagonal elements can be zeroed by a sequence of Givens rotations.
Note that \(\tilde R^T \tilde R = \tilde A^T \tilde A\), where the RHS is included in \(A^T A = R^T R\). Therefore \(\tilde R\) can be obtained by Cholesky decomposition.
Implements BaseQR< VectorType >.
|
virtual |
Set \(y = Qx\). The size of \(x\) should be consistent with the size of the R matrix.
Implements BaseQR< VectorType >.
|
virtual |
Set \(y = Q^Tx\). The size of \(x\) should be consistent with the size of column vectors.
Implements BaseQR< VectorType >.
|
virtual |
Set \(y = QRx\). The size of \(x\) should be consistent with the size of the R matrix.
Implements BaseQR< VectorType >.
|
virtual |
Set \(y = R^T Q^Tx\). The size of \(x\) should be consistent with the size of column vectors.
Implements BaseQR< VectorType >.
|
private |
Apply givens rotation in the (i,j)
-plane to Q
and R
so that R(k,k)
is zeroed.
See Chapter 5.1.9 of Golub 2013, Matrix computations.
Return size of the subspace.
|
inherited |
Return the current upper triangular matrix R.
|
inherited |
Solve \(Rx=y\). Vectors x
and y
should be consistent with the current size of the subspace. If transpose
is true
, \(R^Tx=y\) is solved instead.
|
inherited |
Connect a slot to retrieve a notification when the Givens rotations are performed.
The function takes two indices, i
and j
, describing the plane of rotation, and a triplet of numbers csr
(cosine, sine and radius, see Utilities::LinearAlgebra::givens_rotation()) which represents the rotation matrix.
|
protectedinherited |
Compute \(y=Hx\) where \(H\) is the matrix formed by the column vectors stored by this object.
|
protectedinherited |
Multiply with transpose columns stored in the object.
|
private |
|
protectedinherited |
|
protectedinherited |