# 2.1.17.6.3 ocmath_lu

## Description

Uses partial pivoting, with row interchanges.

## Syntax

int ocmath_lu( double * pMatIO, long * pIpiv, int m, int n )

## Parameters

pMatIO
[modify] input:pointer to original matrix, of size m by n
output: overwritten by the factors L and U; the unit diagonal
elements of L are not stored.
pIpiv
[output] pointer to the pivot indices of size min(m, n) by 1.
Row i of the original matrix is interchanged
with row pIpiv[i - 1] for i = 1,2, ..., min(m, n).
m
[input] row number of matrix
n
[input] column number of matrix

## Return

= OE_NOERROR(0): successful exit
= -1: m or n is less than 1
= NE_SINGULAR: u(<value>, <value>) is exactly zero. The factorization has been completed but the factor U is exactly singular, and division by zero will occur if it is subsequently used to solve a system of linear equations or to invert A.
= NE_ALLOC_FAIL: Memory allocation failed.
= NE_INTERNAL_ERROR: An internal error has occurred in this function. Check the function call and any array sizes. If the call is correct then please consult NAG for assistance.

## Examples

EX1

void ocmath_lu_ex1()
{
//assume Matrix1(datatype: double) contains data
Matrix    matIO("MBook1");
matrix<long> matIPIV;
int m = matIO.GetNumRows();
int n = matIO.GetNumCols();
matIPIV.SetSize(min(m,n), 1);
ocmath_lu(matIO, matIPIV, m, n);
}

## Remark

Forms the LU factorization of a real m by n matrix A as A = PLU, where P is a permutation matrix, L is lower triangular with unit diagonal elements (lower trapezoidal if m > n) and U is upper triangular (upper trapezoidal if m < n).
Usually A is square(m = n), and both L and U are triangular.
The function uses partial pivoting, with row interchanges.