Hubbry Logo
Incomplete Cholesky factorizationIncomplete Cholesky factorizationMain
Open search
Incomplete Cholesky factorization
Community hub
Incomplete Cholesky factorization
logo
7 pages, 0 posts
0 subscribers
Be the first to start a discussion here.
Be the first to start a discussion here.
Incomplete Cholesky factorization
Incomplete Cholesky factorization
from Wikipedia

In numerical analysis, an incomplete Cholesky factorization of a symmetric positive definite matrix is a sparse approximation of the Cholesky factorization. An incomplete Cholesky factorization is often used as a preconditioner for algorithms like the conjugate gradient method.

The Cholesky factorization of a positive definite matrix A is A = LL* where L is a lower triangular matrix. An incomplete Cholesky factorization is given by a sparse lower triangular matrix K that is in some sense close to L. The corresponding preconditioner is KK*.

One popular way to find such a matrix K is to use the algorithm for finding the exact Cholesky decomposition in which K has the same sparsity pattern as A (any entry of K is set to zero if the corresponding entry in A is also zero). This gives an incomplete Cholesky factorization which is as sparse as the matrix A.

Motivation

[edit]

Consider the following matrix as an example:

If we apply the full regular Cholesky decomposition, it yields:

And, by definition:

However, by applying Cholesky decomposition, we observe that some zero elements in the original matrix end up being non-zero elements in the decomposed matrix, like elements (4,2), (5,2) and (5,3) in this example. These elements are known as "fill-ins".

This is not an issue per se, but it is very problematic when working with sparse matrices, since the fill-ins generation is mostly unpredictable and reduces the matrix sparsity, impacting the efficiency of sparse matrix algorithms.

Therefore, given the importance of the Cholesky decomposition in matrix calculations, it is extremely relevant to repurpose the regular method, so as to eliminate the fill-ins generation. The incomplete Cholesky factorization does exactly that, by generating a matrix L similar to the one generated by the regular method, but conserving the zero elements in the original matrix.

Naturally:

Multiplying matrix L generated by incomplete Cholesky factorization by its transpose won't yield the original matrix, but a similar one.

Algorithm

[edit]

For from to :

For from to :

Implementation

[edit]

Implementation of the incomplete Cholesky factorization in the GNU Octave language. The factorization is stored as a lower triangular matrix, with the elements in the upper triangle set to zero.

function a = ichol(a)
	n = size(a,1);

	for k = 1:n
		a(k,k) = sqrt(a(k,k));
		for i = (k+1):n
		    if (a(i,k) != 0)
		        a(i,k) = a(i,k)/a(k,k);            
		    endif
		endfor
		for j = (k+1):n
		    for i = j:n
		        if (a(i,j) != 0)
		            a(i,j) = a(i,j) - a(i,k)*a(j,k);  
		        endif
		    endfor
		endfor
	endfor

    for i = 1:n
        for j = i+1:n
            a(i,j) = 0;
        endfor
    endfor            
endfunction

Sparse example

[edit]

Consider again the matrix displayed in the beginning of this article. Since it is symmetric and the method only uses the lower triangular elements, we can represent it by:

More specifically, in its sparse form as a coordinate list, sweeping rows first:

Value	5	-2	-2	-2	5	-2	5	-2	5	-2	5
Row		1	2	4	5	2	3	3	4	4	5	5
Col		1	1	1	1	2	2	3	3	4	4	5

Then, we take the square root of (1,1) and divide the other (i,1) elements by the result:

Value	2.24 -0.89 -0.89 -0.89	| 5 -2 5 -2 5 -2 5
Row		1	  2	   4	 5	    | 2 3  3 4  4 5  5
Col		1	  1	   1  	 1	    | 2 2  3 3  4 4  5

After that, for all the other elements with column greater than 1, calculate (i,j)=(i,j)-(i,1)*(j,1) if (i,1) and (j,1) exist. For example: (5,4) = (5,4)-(5,1)*(4,1) = -2 -(-0.89*-0.89) = -2.8.

Value	2.24 -0.89 -0.89 -0.89	| 4.2 -2 5 -2 4.2 -2.8 4.2
Row		1	  2	   4	 5	    | 2   3  3 4  4	  5    5
Col		1	  1	   1  	 1	    | 2   2  3 3  4	  4    5
                                  ↑           ↑   ↑    ↑

The elements (2,2), (4,4), (5,4) and (5,5) (marked with an arrow) have been recalculated, since they obey this rule. On the other hand, the elements (3,2), (3,3) and (4,3) won't be recalculated since the element (3,1) doesn't exist, even though the elements (2,1) and (4,1) exist.


Now, repeat the process, but for (i,2). Take the square root of (2,2) and divide the other (i,2) elements by the result:

Value	2.24 -0.89 -0.89 -0.89	| 2.05 -0.98 | 5 -2 4.2 -2.8 4.2
Row		1	  2	   4	 5	    | 2    3     | 3  4 4   5    5
Col		1	  1	   1  	 1	    | 2    2     | 3  3 4   4    5

Again, for elements with column greater than 2, calculate (i,j)=(i,j)-(i,2)*(j,2) if (i,2) and (j,2) exist:

Value	2.24 -0.89 -0.89 -0.89	| 2.05 -0.98 | 4.05 -2 4.2 -2.8 4.2
Row		1	  2	   4	 5	    | 2    3     | 3    4  4   5    5
Col		1	  1	   1  	 1	    | 2    2     | 3    3  4   4    5
                                               ↑

Repeat for (i,3). Take the square root of (3,3) and divide the other (i,3):

Value	2.24 -0.89 -0.89 -0.89	2.05 -0.98 | 2.01 -0.99 | 4.2 -2.8 4.2
Row		1	  2	   4	 5	    2    3     | 3    4     | 4	  5    5
Col		1	  1	   1  	 1	    2    2     | 3    3     | 4	  4    5

For elements with column greater than 3, calculate (i,j)=(i,j)-(i,3)*(j,3) if (i,3) and (j,3) exist:

Value	2.24 -0.89 -0.89 -0.89	2.05 -0.98 | 2.01 -0.99 | 3.21 -2.8 4.2
Row		1	  2	   4	 5	    2    3     | 3    4     | 4	   5    5
Col		1	  1	   1  	 1	    2    2     | 3    3     | 4	   4    5
                                                          ↑

Repeat for (i,4). Take the square root of (4,4) and divide the other (i,4):

Value	2.24 -0.89 -0.89 -0.89	2.05 -0.98 2.01 -0.99 | 1.79 -1.56 | 4.2
Row		1	  2	   4	 5	    2    3     3    4     | 4	   5   | 5
Col		1	  1	   1  	 1	    2    2     3    3     | 4	   4   | 5

For elements with column greater than 4, calculate (i,j)=(i,j)-(i,4)*(j,4) if (i,4) and (j,4) exist:

Value	2.24 -0.89 -0.89 -0.89	2.05 -0.98 2.01 -0.99 | 1.79 -1.56 | 1.76
Row		1	  2	   4	 5	    2    3     3    4     | 4	   5   | 5
Col		1	  1	   1  	 1	    2    2     3    3     | 4	   4   | 5
                                                                     ↑

Finally take the square root of (5,5):

Value	2.24 -0.89 -0.89 -0.89	2.05 -0.98 2.01 -0.99 1.79 -1.56 | 1.33
Row		1	  2	   4	 5	    2    3     3    4     4	   5     | 5
Col		1	  1	   1  	 1	    2    2     3    3     4	   4     | 5

Expanding the matrix to its full form:

Note that in this case no fill-ins were generated compared to the original matrix. The elements (4,2), (5,2) and (5,3) are still zero.

However, if we perform the multiplication of L to its transpose:

We get a matrix slightly different from the original one, since the decomposition didn't take into account all the elements, in order to eliminate the fill-ins.

Sparse implementation

[edit]

The sparse version for the incomplete Cholesky factorization (the same procedure presented above) implemented in MATLAB can be seen below. Naturally, MATLAB has its own means for dealing with sparse matrixes, but the code below was made explicit for pedagogic purposes. This algorithm is efficient, since it treats the matrix as a sequential 1D array, automatically avoiding the zero elements.

function A=Sp_ichol(A)
	n=size(A,1);
	ncols=A(n).col;
    c_end=0;
    for col=1:ncols
        is_next_col=0;
        c_start=c_end+1;
        for i=c_start:n
            if A(i).col==col % in the current column (col):
                if A(i).col==A(i).row 
                    A(i).val=sqrt(A(i).val); % take the square root of the current column's diagonal element
                    div=A(i).val;
                else
                    A(i).val=A(i).val/div; % divide the other current column's elements by the square root of the diagonal element
                end
            end
            if A(i).col>col % in the next columns (col+1 ... ncols):
                if is_next_col==0
                    c_end=i-1;
                    is_next_col=1;
                end
                v1=0;
                v2=0;
                for j=c_start:c_end
                    if A(j).col==col
                        if A(j).row==A(i).row % search for current column's (col) elements A(j) whose row index is the same as current element's A(i) row index
                            v1=A(j).val;
                        end
                        if A(j).row==A(i).col % search for current column's (col) elements A(j) whose row index is the same as current element's A(i) column index
                            v2=A(j).val;
                        end
                        if v1~=0 && v2~=0 % if these elements exist in the current column (col), recalculate the current element A(i):
                            A(i).val=A(i).val-v1*v2;
                            break;
                        end
                    end
                end
            end
        end
    end
end

References

[edit]
Revisions and contributorsEdit on WikipediaRead on Wikipedia
from Grokipedia
Incomplete Cholesky factorization is a sparse approximate method in that decomposes a symmetric positive definite (SPD) matrix AA into ALLTA \approx LL^T, where LL is a lower triangular matrix with a controlled sparsity pattern to limit computational fill-in during the decomposition process. This approximation preserves the positive definiteness of AA under certain conditions, such as diagonal dominance, and is particularly effective for large sparse matrices arising from discretizations of partial differential equations. Unlike the full Cholesky factorization, which can introduce excessive nonzero elements and increase storage and time costs, the incomplete version drops elements beyond a predefined sparsity pattern, making it suitable for preconditioning iterative solvers. The method was originally developed by Meijerink and van der Vorst in 1977 as part of an iterative solution strategy for linear systems Ax=bAx = b where AA is a symmetric M-matrix, a class of SPD matrices with nonpositive off-diagonal entries. They proposed the factorization as a regular splitting A=LLTRA = LL^T - R, where RR is the residual matrix with nonzeros only outside the allowed pattern, ensuring convergence when combined with methods like the conjugate gradient algorithm. This approach demonstrated superior performance over earlier iterative techniques, such as successive line over-relaxation, in numerical tests on discretizations of elliptic problems. Computationally, the factorization is obtained by modifying the standard Cholesky algorithm to neglect certain off-diagonal entries during , typically using a level-of-fill kk (as in IC(kk)) or a drop tolerance for threshold-based variants. For the basic IC(0) case, the sparsity pattern of LL matches that of AA, avoiding any fill-in. When the standard procedure fails to produce a valid (e.g., due to pivoting issues or loss of ), modified versions like ICNR(0) or ICNE(0) incorporate diagonal shifts to enforce existence while approximating the spectrum of AA. As a , incomplete Cholesky factorization clusters the eigenvalues of the preconditioned matrix, accelerating the convergence of methods like preconditioned conjugate gradients, often achieving speedups of 4 to 5 times in practical implementations on parallel hardware. It is widely applied in solving sparse linear systems from , , and optimization, though its effectiveness can depend on matrix ordering and conditioning. Advanced variants, such as multilevel or threshold-dropping approaches, further enhance robustness for ill-conditioned problems.

Introduction

Definition

Incomplete Cholesky factorization is an approximation to the complete for symmetric positive definite (SPD) matrices, where a sparse lower LL is computed such that ALLTA \approx LL^T. This sparsity in LL is enforced by dropping certain elements—either those outside a predefined sparsity pattern (such as the pattern of AA itself) or those below a specified threshold—during the factorization process, thereby limiting fill-in compared to the exact factorization. The method was originally developed for matrices arising from discretizations, particularly symmetric M-matrices, to ensure . In mathematical terms, the factorization often incorporates a PP to minimize fill-in, satisfying PAPT=LLT+DP A P^T = L L^T + D, where LL is a sparse lower and DD represents the matrix of dropped terms, which is typically neglected in the approximation to yield PAPTLLTP A P^T \approx L L^T. This formulation preserves the of the original matrix AA under certain conditions on the dropping , as the approximate factor LLTLL^T remains SPD. The primary purpose of incomplete Cholesky factorization is to serve as a in iterative solvers, such as the , for large sparse linear systems Ax=bAx = b. By approximating the exact Cholesky factors while significantly reducing computational and storage costs, it accelerates convergence without requiring the full dense factorization. This makes it particularly valuable for applications in scientific computing, such as solving partial differential equations on sparse grids.

Historical Development

The development of incomplete Cholesky factorization emerged in the context of early iterative methods for solving large-scale linear systems arising in scientific computing, particularly following the introduction of the by Hestenes and Stiefel in 1952, which highlighted the need for effective preconditioners to handle sparse symmetric positive definite matrices. Initial ideas for incomplete factorizations appeared in the late and early as approximations to facilitate convergence in schemes for elliptic partial differential equations. Richard S. Varga formalized one of the earliest variants in 1960, proposing factorization-based splittings for normalized iterative methods applied to boundary value problems, motivated by the computational limitations of direct methods on emerging digital computers. Similar contributions from Buleev in 1960 and Oliphant in 1961 extended these techniques to improve the spectral properties of iteration matrices for difference operators. The 1970s marked a pivotal formalization of incomplete Cholesky factorization, driven by applications in plasma physics and structural analysis where full factorizations were infeasible due to sparsity and scale. In 1977, Meijerink and van der Vorst introduced the IC(0) method, an incomplete Cholesky preconditioner that preserves the sparsity pattern of the lower triangular factor, proving its existence and positive definiteness for symmetric M-matrices and demonstrating its efficacy as a preconditioner for conjugate gradient iterations on five-point finite difference discretizations. Building on this, Kershaw proposed in 1978 a shifted incomplete Cholesky variant to mitigate breakdown issues in plasma simulation problems, where negative pivots could arise, achieving up to 200 times faster convergence than alternating direction implicit methods on challenging systems. These works established incomplete Cholesky as a robust algebraic preconditioner, emphasizing drop tolerance and pivot modifications to balance accuracy and sparsity. Extensions in the 1980s focused on enhancing robustness for general sparse matrices beyond M-matrices, incorporating numerical dropping and ordering strategies to control fill-in in preconditioners for conjugate gradient solvers. Munksgaard's 1980 approach introduced threshold-based dropping during factorization, allowing controlled fill to improve conditioning while limiting storage, particularly for irregular sparse grids in . Ajiz and Jennings further advanced breakdown prevention in 1984 with a modified incomplete Cholesky scheme that ensures through diagonal adjustments, widely adopted for elliptic PDEs on unstructured meshes. These innovations addressed the sensitivity of early methods to matrix ordering, paving the way for broader use in sparse linear algebra libraries. By the and , incomplete Cholesky factorization was integrated into major scientific computing software packages, reflecting its maturity as a standard for high-performance simulations. The Portable, Extensible Toolkit for Scientific Computation (PETSc), initiated in the early 1990s, incorporated IC variants including threshold dropping, enabling scalable implementations for parallel architectures in applications like and modeling. Similarly, the , developed from the late 1990s, included incomplete Cholesky options within its BoomerAMG framework for hybrid preconditioning in large-scale multiphysics problems. Post-2010 developments have emphasized acceleration on modern hardware, with GPU-optimized algorithms emerging around 2012 to parallelize the factorization and solves, achieving speedups of approximately 2 to 3 times over CPU versions for sparse systems in and . Hybrid variants combining incomplete Cholesky with multigrid or low-rank updates have further extended its applicability to challenges. More recent advances, as of 2024, include robust implementations in half-precision arithmetic for improved energy efficiency in large-scale simulations.

Mathematical Background

Complete Cholesky Factorization

The Cholesky factorization provides an exact decomposition for symmetric positive definite matrices. Specifically, for an n×nn \times n symmetric positive definite matrix AA, it expresses A=LLTA = LL^T, where LL is a lower triangular matrix with positive diagonal entries. This decomposition leverages the symmetry and positive definiteness of AA to halve the storage and computational requirements compared to general LU factorizations. The algorithm derives from equating entries in the matrix equation A=LLTA = LL^T. It proceeds column-by-column, computing the elements of LL recursively. For the diagonal entry at position ii, lii=aiik=1i1lik2,l_{ii} = \sqrt{ a_{ii} - \sum_{k=1}^{i-1} l_{ik}^2 },
Add your contribution
Related Hubs
User Avatar
No comments yet.