Reference documentation for deal.II version Git b927e2c03c 2022-01-17 18:55:39 -0500
ImplicitQR< VectorType > Class Template Reference

#include <deal.II/lac/qr.h>

Inheritance diagram for ImplicitQR< VectorType >:
[legend]

## Public Types

using Number = typename VectorType::value_type

## Public Member Functions

ImplicitQR ()

virtual ~ImplicitQR ()=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

boost::signals2::connection connect_append_column_slot (const std::function< bool(const Vector< Number > &u, const Number &rho2, const Number &col_norm_sqr)> &slot)

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< NumberR

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

boost::signals2::signal< bool(const Vector< Number > &u, const Number &rho, const Number &col_norm_sqr)> column_signal

## Detailed Description

### template<typename VectorType> class ImplicitQR< VectorType >

A class to obtain the triangular $$R$$ matrix of the $$A=QR$$ factorization together with the matrix $$A$$ itself. The orthonormal matrix $$Q$$ is not stored explicitly, the name of the class. The multiplication with $$Q$$ can be represented as $$Q=A R^{-1}$$, whereas the multiplication with $$Q^T$$ is given by $$Q^T=R^{-T}A^T$$.

The class is designed to update a given (possibly empty) QR factorization due to the addition of a new column vector. This is equivalent to constructing an orthonormal basis by the Gram-Schmidt procedure. The class also provides update functionality when the 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.

Definition at line 349 of file qr.h.

## ◆ Number

template<typename VectorType >
 using ImplicitQR< VectorType >::Number = typename VectorType::value_type

Number type for R matrix.

Definition at line 355 of file qr.h.

## ◆ ImplicitQR()

template<typename VectorType >
 ImplicitQR< VectorType >::ImplicitQR ( )

Default constructor.

## ◆ ~ImplicitQR()

template<typename VectorType >
 virtual ImplicitQR< VectorType >::~ImplicitQR ( )
virtualdefault

Destructor.

## ◆ append_column()

template<typename VectorType >
 virtual bool ImplicitQR< VectorType >::append_column ( const VectorType & column )
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.

Implements BaseQR< VectorType >.

## ◆ remove_column()

template<typename VectorType >
 virtual void ImplicitQR< VectorType >::remove_column ( const unsigned int k = 0 )
virtual

Remove column and update QR factorization.

Starting from the given QR decomposition $$QR= A = [a_1\,\dots a_n], \quad a_i \in R^m$$ we aim at computing factorization of $$\tilde Q \tilde R= \tilde A = [a_2\,\dots a_n], \quad a_i \in R^m$$.

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 >.

## ◆ multiply_with_Q()

template<typename VectorType >
 virtual void ImplicitQR< VectorType >::multiply_with_Q ( VectorType & y, const Vector< Number > & x ) const
virtual

Set $$y = Qx$$. The size of $$x$$ should be consistent with the size of the R matrix.

Implements BaseQR< VectorType >.

## ◆ multiply_with_QT()

template<typename VectorType >
 virtual void ImplicitQR< VectorType >::multiply_with_QT ( Vector< Number > & y, const VectorType & x ) const
virtual

Set $$y = Q^Tx$$. The size of $$x$$ should be consistent with the size of column vectors.

Implements BaseQR< VectorType >.

## ◆ multiply_with_A()

template<typename VectorType >
 virtual void ImplicitQR< VectorType >::multiply_with_A ( VectorType & y, const Vector< Number > & x ) const
virtual

Set $$y = QRx$$. The size of $$x$$ should be consistent with the size of the R matrix.

Implements BaseQR< VectorType >.

## ◆ multiply_with_AT()

template<typename VectorType >
 virtual void ImplicitQR< VectorType >::multiply_with_AT ( Vector< Number > & y, const VectorType & x ) const
virtual

Set $$y = R^T Q^Tx$$. The size of $$x$$ should be consistent with the size of column vectors.

Implements BaseQR< VectorType >.

## ◆ connect_append_column_slot()

template<typename VectorType >
 boost::signals2::connection ImplicitQR< VectorType >::connect_append_column_slot ( const std::function< bool(const Vector< Number > &u, const Number &rho2, const Number &col_norm_sqr)> & slot )

Connect a slot to implement a custom check of linear dependency during addition of a column.

Here, u is the last column of the to-be R matrix, rho is its diagonal and col_norm_sqr is the square of the $$l2$$ norm of the column. The function should return true if the new column is linearly independent.

## ◆ apply_givens_rotation()

template<typename VectorType >
 void ImplicitQR< VectorType >::apply_givens_rotation ( const unsigned int i, const unsigned int k )
private

Apply givens rotation in the (i,k)-plane to zero out $$R(k,k)$$.

## ◆ size()

template<typename VectorType >
 unsigned int BaseQR< VectorType >::size ( ) const
inherited

Return size of the subspace.

## ◆ get_R()

template<typename VectorType >
 const LAPACKFullMatrix& BaseQR< VectorType >::get_R ( ) const
inherited

Return the current upper triangular matrix R.

## ◆ solve()

template<typename VectorType >
 void BaseQR< VectorType >::solve ( Vector< Number > & x, const Vector< Number > & y, const bool transpose = false ) const
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.

## ◆ connect_givens_slot()

template<typename VectorType >
 boost::signals2::connection BaseQR< VectorType >::connect_givens_slot ( const std::function< void(const unsigned int i, const unsigned int j, const std::array< Number, 3 > &csr)> & slot )
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.

## ◆ multiply_with_cols()

template<typename VectorType >
 void BaseQR< VectorType >::multiply_with_cols ( VectorType & y, const Vector< Number > & x ) const
protectedinherited

Compute $$y=Hx$$ where $$H$$ is the matrix formed by the column vectors stored by this object.

## ◆ multiply_with_colsT()

template<typename VectorType >
 void BaseQR< VectorType >::multiply_with_colsT ( Vector< Number > & y, const VectorType & x ) const
protectedinherited

Multiply with transpose columns stored in the object.

## ◆ column_signal

template<typename VectorType >
 boost::signals2::signal &u, const Number & rho, const Number & col_norm_sqr)> ImplicitQR< VectorType >::column_signal
private

Signal used to decide if the new column is linear dependent.

Here, u is the last column of the to-be R matrix, rho is its diagonal and col_norm_sqr is the square of the $$l2$$ norm of the column. The function should return true if the new column is linearly independent.

Definition at line 430 of file qr.h.

## ◆ columns

template<typename VectorType >
 std::vector > BaseQR< VectorType >::columns
protectedinherited

A vector of unique pointers to store columns.

Definition at line 160 of file qr.h.

## ◆ R

template<typename VectorType >
 LAPACKFullMatrix BaseQR< VectorType >::R
protectedinherited

Matrix to store R.

Definition at line 165 of file qr.h.

## ◆ current_size

template<typename VectorType >
 unsigned int BaseQR< VectorType >::current_size
protectedinherited

Current size (number of columns in Q).

Definition at line 170 of file qr.h.

## ◆ givens_signal

template<typename VectorType >
 boost::signals2::signal &)> BaseQR< VectorType >::givens_signal
protectedinherited

Signal used to retrieve a notification when Givens rotations are performed in the (i,j)-plane.

Definition at line 179 of file qr.h.

The documentation for this class was generated from the following file:
• include/deal.II/lac/qr.h