scipy.linalg.

cho_factor#

scipy.linalg.cho_factor(a, lower=False, overwrite_a=False, check_finite=True)[source]#

Compute the Cholesky decomposition of a matrix, to use in cho_solve.

Returns a matrix containing the Cholesky decomposition, A = L L* or A = U* U of a Hermitian positive-definite matrix a. The return value can be directly used as the first parameter to cho_solve.

Warning

If overwrite_a is disabled, this function matches cholesky and zeros the other triangle. If it is enabled, the returned matrix may contain random data in the entries not used by the Cholesky decomposition, saving out on the explicit putting to 0 done by cholesky.

Parameters:
a(…, M, M) array_like

Matrix to be decomposed

lowerbool, optional

Whether to compute the upper or lower triangular Cholesky factorization. During decomposition, only the selected half of the matrix is referenced. (Default: upper-triangular)

overwrite_abool, optional

Whether to overwrite data in a (may improve performance)

check_finitebool, optional

Whether to check that the entire input matrix contains only finite numbers. Disabling may give a performance gain, but may result in problems (crashes, non-termination) if the inputs do contain infinities or NaNs.

Returns:
c(…, M, M) ndarray

Matrix whose upper or lower triangle contains the Cholesky factor of a. Other parts of the matrix contain random data.

lowerndarray, bool

Flag indicating whether the factor is in the lower or upper triangle

Raises:
LinAlgError

Raised if decomposition fails.

See also

cholesky

Compute the Cholesky decomposition and explicitly put the other triangle to 0.

cho_solve

Solve a linear set equations using the Cholesky factorization of a matrix.

Notes

During the finiteness check (if selected), the entire matrix a is checked. During decomposition, a is assumed to be symmetric or Hermitian (as applicable), and only the half selected by option lower is referenced. Consequently, if a is asymmetric/non-Hermitian, cholesky may still succeed if the symmetric/Hermitian matrix represented by the selected half is positive definite, yet it may fail if an element in the other half is non-finite.

Examples

>>> import numpy as np
>>> from scipy.linalg import cho_factor
>>> A = np.array([[9, 3, 1, 5], [3, 7, 5, 1], [1, 5, 9, 2], [5, 1, 2, 6]],
...             dtype=float, order="F")
>>> A_ref = np.copy(A)
>>> c, low = cho_factor(A)
>>> c
array([[3.        , 1.        , 0.33333333, 1.66666667],
       [0.        , 2.44948974, 1.90515869, -0.27216553],
       [0.        , 0.        , 2.29330749, 0.8559528 ],
       [0.        , 0.        , 0.        , 1.55418563]])
>>> np.allclose(c.T @ c - A, np.zeros((4, 4)))
True
>>> c, low = cho_factor(A, overwrite_a=True)
>>> c
array([[3.        , 1.        , 0.33333333, 1.66666667],
       [3.        , 2.44948974, 1.90515869, -0.27216553],
       [1.        , 5.        , 2.29330749, 0.8559528 ],
       [5.        , 1.        , 2.        , 1.55418563]])
>>> np.allclose(np.triu(c).T @ np.triu(c) - A_ref, np.zeros((4, 4)))
True