org.ejml.dense.row.linsol.qr

## Class BaseLinearSolverQrp_DDRM

• All Implemented Interfaces:
LinearSolver<DMatrixRMaj,DMatrixRMaj>, LinearSolverDense<DMatrixRMaj>
Direct Known Subclasses:
LinearSolverQrpHouseCol_DDRM, SolvePseudoInverseQrp_DDRM

```public abstract class BaseLinearSolverQrp_DDRM
extends LinearSolverAbstract_DDRM```

Base class for QR pivot based pseudo inverse classes. It will return either the basic of minimal 2-norm solution. See [1] for details. The minimal 2-norm solution refers to the solution 'x' whose 2-norm is the smallest making it unique, not some other error function.

``` R = [ R12  R12 ] r      P^T*x = [ y ] r       Q^T*b = [ c ] r
[  0    0  ] m-r            [ z ] n -r            [ d ] m-r
r   n-r

where r is the rank of the matrix and (m,n) is the dimension of the linear system.
```
``` The solution 'x' is found by solving the system below.  The basic solution is found by setting z=0

[ R_11^-1*(c - R12*z) ]
x = [          z          ]
```

NOTE: The matrix rank is determined using the provided QR decomposition. [1] mentions that this will not always work and could cause some problems.

[1] See page 258-259 in Gene H. Golub and Charles F. Van Loan "Matrix Computations" 3rd Ed, 1996

• ### Field Summary

Fields
Modifier and Type Field and Description
`protected DMatrixRMaj` `I`
`protected LinearSolverDense<DMatrixRMaj>` `internalSolver`
`protected boolean` `norm2Solution`
`protected DMatrixRMaj` `R`
`protected DMatrixRMaj` `R11`
`protected int` `rank`
`protected DMatrixRMaj` `Y`
• ### Fields inherited from class org.ejml.dense.row.linsol.LinearSolverAbstract_DDRM

`A, numCols, numRows`
• ### Constructor Summary

Constructors
Modifier Constructor and Description
`protected ` ```BaseLinearSolverQrp_DDRM(QRPDecomposition_F64<DMatrixRMaj> decomposition, boolean norm2Solution)```
Configures internal parameters.
• ### Method Summary

All Methods
Modifier and Type Method and Description
`QRPDecomposition_F64<DMatrixRMaj>` `getDecomposition()`
If a decomposition class was used internally then this will return that class.
`void` `invert(DMatrixRMaj A_inv)`
Computes the inverse of of the 'A' matrix passed into `LinearSolver.setA(Matrix)` and writes the results to the provided matrix.
`double` `quality()`
Returns a very quick to compute measure of how singular the system is.
`boolean` `setA(DMatrixRMaj A)`
Specifies the A matrix in the linear equation.
`protected void` `upgradeSolution(DMatrixRMaj X)`
Upgrades the basic solution to the optimal 2-norm solution.
• ### Methods inherited from class org.ejml.dense.row.linsol.LinearSolverAbstract_DDRM

`_setA, getA`
• ### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`
• ### Methods inherited from interface org.ejml.interfaces.linsol.LinearSolver

`modifiesA, modifiesB, solve`
• ### Field Detail

• #### norm2Solution

`protected boolean norm2Solution`
• #### Y

`protected DMatrixRMaj Y`
• #### R

`protected DMatrixRMaj R`
• #### R11

`protected DMatrixRMaj R11`
• #### I

`protected DMatrixRMaj I`
• #### rank

`protected int rank`
• #### internalSolver

`protected LinearSolverDense<DMatrixRMaj> internalSolver`
• ### Constructor Detail

• #### BaseLinearSolverQrp_DDRM

```protected BaseLinearSolverQrp_DDRM(QRPDecomposition_F64<DMatrixRMaj> decomposition,
boolean norm2Solution)```
Configures internal parameters.
Parameters:
`decomposition` - Used to solve the linear system.
`norm2Solution` - If true then the optimal 2-norm solution will be computed for degenerate systems.
• ### Method Detail

• #### setA

`public boolean setA(DMatrixRMaj A)`
Description copied from interface: `LinearSolver`

Specifies the A matrix in the linear equation. A reference might be saved and it might also be modified depending on the implementation. If it is modified then `LinearSolver.modifiesA()` will return true.

If this value returns true that does not guarantee a valid solution was generated. This is because some decompositions don't detect singular matrices.

Parameters:
`A` - The 'A' matrix in the linear equation. Might be modified or save the reference.
Returns:
true if it can be processed.
• #### quality

`public double quality()`
Description copied from interface: `LinearSolver`

Returns a very quick to compute measure of how singular the system is. This measure will be invariant to the scale of the matrix and always be positive, with larger values indicating it is less singular. If not supported by the solver then the runtime exception IllegalArgumentException is thrown. This is NOT the matrix's condition.

How this function is implemented is not specified. One possible implementation is the following: In many decompositions a triangular matrix is extracted. The determinant of a triangular matrix is easily computed and once normalized to be scale invariant and its absolute value taken it will provide functionality described above.

Returns:
The quality of the linear system.

`protected void upgradeSolution(DMatrixRMaj X)`

Upgrades the basic solution to the optimal 2-norm solution.

``` First solves for 'z'

|| x_b - P*[ R_11^-1 * R_12 ] * z ||2
min z ||         [ - I_{n-r}      ]     ||

```
Parameters:
`X` - basic solution, also output solution
• #### invert

`public void invert(DMatrixRMaj A_inv)`
Description copied from interface: `LinearSolverDense`
Computes the inverse of of the 'A' matrix passed into `LinearSolver.setA(Matrix)` and writes the results to the provided matrix. If 'A_inv' needs to be different from 'A' is implementation dependent.
Specified by:
`invert` in interface `LinearSolverDense<DMatrixRMaj>`
Overrides:
`invert` in class `LinearSolverAbstract_DDRM`
Parameters:
`A_inv` - Where the inverted matrix saved. Modified.
• #### getDecomposition

`public QRPDecomposition_F64<DMatrixRMaj> getDecomposition()`
Description copied from interface: `LinearSolver`
If a decomposition class was used internally then this will return that class. Most linear solvers decompose the input matrix into a more simplistic form. However some solutions do not require decomposition, e.g. inverse by minor.
Returns:
Internal decomposition class. If there is none then null.