Login     Register

        Contact Us     Search

XLeratorDB/math Documentation

SQL Server LU decomposition


LUdecomp_q

Updated: 19 January 2015


Use the table-value function LUdecomp_q to calculate the LU factorization of an N x N matrix A using partial pivoting. LUdecomp_q returns a lower triangular matrix L, an upper triangular matrix U, and a permutation matrix P such that,
 
                LU = PA
 
This means that L has only zeroes above the diagonal and U has only zeroes below the diagonal.
For a 3 x 3 matrix this becomes:


Syntax
SELECT * FROM [wct].[LUdecomp_q](
   <@Matrix_RangeQuery, nvarchar(max),>)
Arguments
@Matrix_RangeQuery
the SELECT statement, as text, used to determine the square (N x N) matrix to be used in this function. The SELECT statement specifies the column names from the table or view or can be used to enter the matrix values directly. Data returned from the @Matrix_RangeQuery select must be of the type float or of a type that implicitly converts to float.
Return Types
TABLE (
       [RowNum] [int] NULL,
       [ColNum] [int] NULL,
       [Value] [float] NULL,
       [Type] [nvarchar](2) NULL
)
Remarks
·         The number of columns in the matrix must be equal to the number of rows or an error will be returned.
·         Use the LUdecomp function for simpler queries.
·         Use LUdecompN_q for a table in third-normal form.
·         Use LU for a matrix stored as a string.
·         Type is either 'L', 'U', or 'P'.
·         The function returns an error if the array contains a non-numeric value.
Examples
In this example, we calculate the LU decomposition directly from the SELECT statement.
SELECT
   *
FROM
   wct.LUdecomp_q('
       SELECT 0.002,1.231,2.471 UNION ALL
       SELECT 1.196,3.165,2.54 UNION ALL
       SELECT 1.475,4.271,2.142'
   )
This produces the following result.
RowNum      ColNum      Value                  Type
----------- ----------- ---------------------- ----
0           0           1                      L
0           1           0                      L
0           2           0                      L
1           0           0.00167224080267559    L
1           1           1                      L
1           2           0                      L
2           0           1.23327759197324       L
2           1           0.299970803835884      L
2           2           1                      L
0           0           1.196                  U
0           1           3.165                  U
0           2           2.54                   U
1           0           0                      U
1           1           1.22570735785953       U
1           2           2.4667525083612        U
2           0           0                      U
2           1           0                      U
2           2           -1.73047881640933      U
0           0           0                      P
0           1           1                      P
0           2           0                      P
1           0           1                      P
1           1           0                      P
1           2           0                      P
2           0           0                      P
2           1           0                      P
2           2           1                      P
 


Note that the results are returned in third-normal form. If we wanted to a more traditional (de-normalized) presentation of the results, we could use the PIVOT function.
SELECT
   Type,[0],[1],[2]
FROM (
   SELECT
       *
   FROM
       wct.LUdecomp_q('
          SELECT 0.002,1.231,2.471 UNION ALL
          SELECT 1.196,3.165,2.54 UNION ALL
          SELECT 1.475,4.271,2.142'
          )
       ) d
PIVOT(
   SUM(Value) FOR ColNum in([0],[1],[2])
   ) p

This produces the following result.
Type 0                      1                      2
---- ---------------------- ---------------------- ----------------------
L    1                      0                      0
L    0.00167224080267559    1                      0
L    1.23327759197324       0.299970803835884      1
P    0                      1                      0
P    1                      0                      0
P    0                      0                      1
U    1.196                  3.165                  2.54
U    0                      1.22570735785953       2.4667525083612
U    0                      0                      -1.73047881640933


In this example, we demonstrate how to reconstruct the input matrix using the calculation P'LU.
SELECT
   k.*
FROM (
   SELECT
       Type as MatrixType,
       wct.NMATRIX2STRING(RowNum, ColNum, Value) as Matrix
   FROM
       wct.LUdecomp_q('
          SELECT 0.002,1.231,2.471 UNION ALL
          SELECT 1.196,3.165,2.54 UNION ALL
          SELECT 1.475,4.271,2.142'
       )
   GROUP BY
       Type
) p PIVOT(MAX(Matrix) FOR MatrixType IN(L,P,U))d
CROSS APPLY
   wct.MATRIX(wct.MATMULT(wct.TRANSPOSE(P),wct.MATMULT(L,U)))K

This produces the following result.
RowNum      ColNum      ItemValue
----------- ----------- ----------------------
0           0           0.00200000000000001
0           1           1.231
0           2           2.471
1           0           1.196
1           1           3.165
1           2           2.54
2           0           1.475
2           1           4.27099999999998
2           2           2.14199999999999
 


In this example, we will use the VALUES statement.
SELECT
   *
FROM
   wct.LUdecomp_q('SELECT * FROM (VALUES
       (0.002,1.231,2.471),
       (1.196,3.165,2.54),
       (1.475,4.271,2.142)
       )n(x1,x2,x3)'
   )

This returns the same result as the first example


This example demonstrates how to use the function by selecting data from a table.
SELECT
   IDENTITY(int,1,1) as rn,
   *
INTO
   #A
FROM (
   VALUES
       (0.002,1.231,2.471),
       (1.196,3.165,2.54),
       (1.475,4.271,2.142)
       )n(x1,x2,x3)
 
SELECT
   *
FROM
   wct.LUdecomp_q('
       SELECT
          x1,x2,x3
       FROM
          #A
       ORDER BY
          rn'
   )

 

See Also
·         QRdecomp - QR decomposition

 



Copyright 2008-2024 Westclintech LLC         Privacy Policy        Terms of Service