HLIBpro
1.2
|
Table of Contents |
For unsymmetric matrices, ๐๐ซ๐จ๐ก๐๐๐ implements LU and LDU factorisation, i.e. the matrix is factorised into
with a lower triangular, unit diagonal matrix , a upper triangular matrix and, in the case of LDU a diagonal matrix (in which case is also unit diagonal).
Both matrix factorisation are available in two modes:
In the case of point-wise factorisation, the possibility of a break-down is high because pivoting is only possible to a very small degree for ๐-matrices and therefore not implemented in ๐๐ซ๐จ๐ก๐๐๐. Therefore, block-wise factorisation is the default factorisation mode, since it can only break down in the case of singular diagonal blocks (in which case some remedy is avaibable, see below).
The factorisation methods are implemented in the classes TLU and TLDU. Factorising using default parameters can be performed as
Here, one thread and a block-wise accuracy of were used during LU. By replacing TLU with TLDU, the corresponding factorisation method is used. Furthermore, for both variants, functional forms are available, called lu and ldu:
Matrix factorisation is performed in place, i.e. the individual factors are stored within , thereby overwriting the original content. That also means, that can no longer be used as a standard matrix object, e.g. for matrix vector multiplication, since for that, the content needs special interpretation, e.g. first multiply with upper triangular part, then with lower triangular.
Special classes are avaiable in ๐๐ซ๐จ๐ก๐๐๐ to perform such interpretation, namely:
All matrix vector products are available in the general form where is either , or (see ???).
TLUMatrix (TLDUMatrix) and TLUInvMatrix (TLDUInvMatrix) objects may be created explicitely or by using the corresponding functions of TLU (TLDU):
So far, matrix factorisation was performed with default parameters. Options for matrix factorisation are provided in the form of a fac_options_t object. With it, you may select point-wise factorisation, e.g.:
Also, a progress meter may be assigned for the factorisation:
Furthermore, special modifications in case of a factorisation failure, e.g. for a singular matrix or for a matrix with a bad condition, may be activated.
The first three modification techniques are exclusive, i.e. may not be combined, whereas the last method can be used parallel to the others. Furthermore, all modifications only apply to dense diagonal blocks, thereby bounding the computation complexity of all methods such that the overhead can be neglected.
add_identity
(combined with fix_cond
) is best for handling errors during factorisation.If is symmetric ( ) or hermitian ( ), ๐๐ซ๐จ๐ก๐๐๐ provides the Cholesky (LL) and the LDL factorisation. These are implemented in the classes TLL and TLDL:
or available in functional form:
Again, all factorisation is performed in place and for further evaluation, special matrix objects are needed. Evaluation of is provided by TLLMatrix and TLDLMatrix, whereas evaluation of is implemented in TLLInvMatrix and TLDLInvMatrix. Please note, that the matrix format, e.g. whether symmetric or hermitian, is lost during factorisation but crucial for matrix evaluation and therefore, has to be provided while constructing these matrix objects:
TLDL uses block-wise factorisation but can be switched to point-wise mode using fac_options_t objects as described above. Also, factorisation modifications/stabilisations may be activated for LDL factorisation. Neither of these is supported for Cholesky factorisation as this always used point-wise mode (block-wise is not possible). It is therefore not as stable as LDL factorisation.