My Project

Perform LU decomposition. More...

Functions

AFAPI void lu (array &out, array &pivot, const array &in, const bool is_lapack_piv=true)
 C++ Interface for LU decomposition in packed format.
 
AFAPI void lu (array &lower, array &upper, array &pivot, const array &in)
 C++ Interface for LU decomposition.
 
AFAPI void luInPlace (array &pivot, array &in, const bool is_lapack_piv=true)
 C++ Interface for in place LU decomposition.
 
AFAPI af_err af_lu (af_array *lower, af_array *upper, af_array *pivot, const af_array in)
 C Interface for LU decomposition.
 
AFAPI af_err af_lu_inplace (af_array *pivot, af_array in, const bool is_lapack_piv)
 C Interface for in place LU decomposition.
 

Detailed Description

Perform LU decomposition.

This function decomposes input matrix A into a lower triangle L, an upper triangle U such that

\f$A = L * U\f$

For stability, a permutation array P is also used to modify the formula in the following manner.

\f$A(P, span) = L * U\f$

This operation can be performed in ArrayFire using the following code snippet.

af::array l, u, pivot;
af::lu(l, u, pivot, a_orig);
A multi dimensional data container.
Definition array.h:27
AFAPI void lu(array &out, array &pivot, const array &in, const bool is_lapack_piv=true)
C++ Interface for LU decomposition in packed format.

The permuted version of the original matrix can be reconstructed using the following snippet.

af::array a_recon = af::matmul(l, u);
af::array a_perm = a_orig(pivot, af::span);
AFAPI array matmul(const array &lhs, const array &rhs, const matProp optLhs=AF_MAT_NONE, const matProp optRhs=AF_MAT_NONE)
Matrix multiply of two arrays.
AFAPI seq span

The sample output for these operations can be seen below.

a_orig [3 3 1 1]
0.0000 3.0000 6.0000
1.0000 4.0000 7.0000
2.0000 5.0000 8.0000
l [3 3 1 1]
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
0.5000 0.5000 1.0000
u [3 3 1 1]
2.0000 5.0000 8.0000
0.0000 3.0000 6.0000
0.0000 0.0000 0.0000
pivot [3 1 1 1]
2
0
1
a_recon [3 3 1 1]
2.0000 5.0000 8.0000
0.0000 3.0000 6.0000
1.0000 4.0000 7.0000
a_perm [3 3 1 1]
2.0000 5.0000 8.0000
0.0000 3.0000 6.0000
1.0000 4.0000 7.0000

When memory is a concern, users can perform the LU decomposition in place as shown below.

af::array out = a_orig.copy();
af::array pivot2;
af::luInPlace(pivot2, out, false);
AFAPI void luInPlace(array &pivot, array &in, const bool is_lapack_piv=true)
C++ Interface for in place LU decomposition.
array copy() const
Perform deep copy of the array.

The lower and upper triangle matrices can be obtained if necessary in the following manner.

af::array l2 = lower(out, true);
af::array u2 = upper(out, false);

LU decompositions has many applications including solving a system of linear equations. Check af::solveLU fore more information.


Function Documentation

◆ af_lu()

AFAPI af_err af_lu ( af_array lower,
af_array upper,
af_array pivot,
const af_array  in 
)

C Interface for LU decomposition.

Parameters
[out]lowerwill contain the lower triangular matrix of the LU decomposition
[out]upperwill contain the upper triangular matrix of the LU decomposition
[out]pivotwill contain the permutation indices to map the input to the decomposition
[in]inis the input matrix

◆ af_lu_inplace()

AFAPI af_err af_lu_inplace ( af_array pivot,
af_array  in,
const bool  is_lapack_piv 
)

C Interface for in place LU decomposition.

Parameters
[out]pivotwill contain the permutation indices to map the input to the decomposition
[in,out]incontains the input on entry, the packed LU decomposition on exit
[in]is_lapack_pivspecifies if the pivot is returned in original LAPACK compliant format

◆ lu() [1/2]

AFAPI void lu ( array lower,
array upper,
array pivot,
const array in 
)

C++ Interface for LU decomposition.

Parameters
[out]lowerwill contain the lower triangular matrix of the LU decomposition
[out]upperwill contain the upper triangular matrix of the LU decomposition
[out]pivotwill contain the permutation indices to map the input to the decomposition
[in]inis the input matrix
Note
This function is not supported in GFOR

◆ lu() [2/2]

AFAPI void lu ( array out,
array pivot,
const array in,
const bool  is_lapack_piv = true 
)

C++ Interface for LU decomposition in packed format.

Parameters
[out]outis the output array containing the packed LU decomposition
[out]pivotwill contain the permutation indices to map the input to the decomposition
[in]inis the input matrix
[in]is_lapack_pivspecifies if the pivot is returned in original LAPACK compliant format
Note
This function is not supported in GFOR

◆ luInPlace()

AFAPI void luInPlace ( array pivot,
array in,
const bool  is_lapack_piv = true 
)

C++ Interface for in place LU decomposition.

Parameters
[out]pivotwill contain the permutation indices to map the input to the decomposition
[in,out]incontains the input on entry, the packed LU decomposition on exit
[in]is_lapack_pivspecifies if the pivot is returned in original LAPACK compliant format
Note
This function is not supported in GFOR