croutp

Purpose

Computes the Crout decomposition of a square matrix with partial (row) pivoting.

Format

lup = croutp(x)
Parameters:x (NxN matrix) – square nonsingular matrix.
Returns:lup ((N+1)xN matrix) – containing the lower (\(L\)) and upper (\(U\)) matrices of the Crout decomposition of a permuted x. The \(N+1\) row of the matrix lup gives the row order of the lup matrix. The matrix must be reordered prior to extracting the \(L\) and \(U\) matrices. Use lowmat() and upmat1() to extract the \(L\) and \(U\) matrices from the reordered lup matrix.

Examples

This example illustrates a procedure for extracting \(L\) and \(U\) of the permuted x matrix. It continues by sorting the result of \(LU\) to compare with the original matrix x.

X = { 1 2 -1,
      2 3 -2,
      1 -2 1 };

// Perform crout decomposition
lup = croutp(x);

If we view lup, we will see:

      1.0000       0.50000       0.28571
lup = 2.0000        1.5000       -1.0000
      1.0000       -3.5000      -0.57142
      2.0000        3.0000        1.0000
/*
** This bottom row is the permutation index vector
** Calculate how many rows in 'lup'
*/
r = rows(lup);

/*
** Extract the index row and transpose it into a column
** vector
*/
index = lup[r, .]';

Viewing index will reveal:

        2
index = 3
        1
// Rearrange the rows of 'lup' based upon the index vector
z = lup[index, .];

// obtain L and U of permuted matrix X
L = lowmat(z);
U = upmat1(z);

/*
** Horizontally concatenate the index vector and the product
** of L*U then pass that result into the 'sortc' function
** which will sort this result based upon the first column
** (which is the index vector)
*/
q = sortc(index~(L*U), 1);

/*
** Remove the index vector, which we added by way of
** horizontal concatenation in the statement just above
*/
x2 = q[., 2:cols(q)];

Now at the end of this example, x2 is equal to x.

See also

Functions crout(), chol(), lowmat(), lowmat1(), upmat(), upmat1()