Logo

SQL Server MTRIL Function

Updated 2023-10-17 14:29:36.847000

Description

Use the scalar function MTRIL to return the lower triangular part of the string representation of a matrix.

MTRIL expects a string representation of the matrix, with columns separated by commas and rows separated by semi-colons.

Syntax

SELECT [westclintech].[wct].[MTRIL](
   <@Matrix, nvarchar(max),>)

Arguments

@Matrix

a string representation of a matrix.

Return Type

nvarchar(max)

Remarks

The string representations of @Matrix must only contain numbers, commas (to separate the columns), and semi-colons to separate the rows.

Consecutive commas will generate an error.

Consecutive semi-colons will generate an error.

Non-numeric data between commas will generate an error

Non-number data between semi-colons will generate an error

To convert non-normalized data to a string format, use the Matrix2String or the Matrix2String_q function.

To convert normalized data to a string format, use the NMatrix2String or the NMatrix2String_q function.

Examples

Let's assume that we had the following matrix, A, and we want to return the lower triangular part.

A = [-79,-45,9,9,-91,-5;68,46,9,81,-61,35;83,-25,80,-67,-22,-38;77,40,-24,69,73,-20;-17,-72,-9,-72,-6,-34;64,-47,48,-54,18,11;-4,-36,7,-56,-34,-3;-41,90,78,-43,38,64;-60,-85,-31,-83,-96,-36;-40,31,-93,-62,64,10]

We could enter the following SQL to perform the calculation.

DECLARE @A as varchar(max);
SET @A
    = '-79,-45,9,9,-91,-5;68,46,9,81,-61,35;83,-25,80,-67,-22,-38;77,40,-24,69,73,
              -20;-17,-72,-9,-72,-6,-34;64,-47,48,-54,18,11;-4,-36,7,-56,-34,-3;
              -41,90,78,-43,38,64;-60,-85,-31,-83,-96,-36;-40,31,-93,-62,64,10';
SELECT wct.MTRIL(@A) as [L];

This produces the following result.

L
-79,0,0,0,0,0;68,46,0,0,0,0;83,-25,80,0,0,0;77,40,-24,69,0,0;-17,-72,-9,-72,-6,0;64,-47,48,-54,18,11;-4,-36,7,-56,-34,-3;-41,90,78,-43,38,64;-60,-85,-31,-83,-96,-36;-40,31,-93,-62,64,10

Of course, this is a little hard to read. Since the result is a string, we can reformat the solution to make it easier to read. Simply by changing the SELECT statement:

SELECT item
FROM wct.SPLIT(wct.MTRIL(@A), ';') l;

This produces the following result.

item
-79,0,0,0,0,0
68,46,0,0,0,0
83,-25,80,0,0,0
77,40,-24,69,0,0
-17,-72,-9,-72,-6,0
64,-47,48,-54,18,11
-4,-36,7,-56,-34,-3
-41,90,78,-43,38,64
-60,-85,-31,-83,-96,-36
-40,31,-93,-62,64,10

Which is a little bit easier to follow

However, we can use the table-valued function MATRIX, to format the result in third-normal form where it is even easier to see the output.

SELECT *
FROM wct.MATRIX(wct.MTRIL(@A)) l;

This produces the following result.

RowNumColNumItemValue
00-79
010
020
030
040
050
1068
1146
120
130
140
150
2083
21-25
2280
230
240
250
3077
3140
32-24
3369
340
350
40-17
41-72
42-9
43-72
44-6
450
5064
51-47
5248
53-54
5418
5511
60-4
61-36
627
63-56
64-34
65-3
70-41
7190
7278
73-43
7438
7564
80-60
81-85
82-31
83-83
84-96
85-36
90-40
9131
92-93
93-62
9464
9510

And, if we wanted to see the result in a row/column presentation, we could use the following SQL.

SELECT [0],
       [1],
       [2],
       [3],
       [4],
       [5]
FROM
(SELECT * FROM wct.MATRIX(wct.MTRIL(@A)) ) M
PIVOT
(
    MAX(ItemValue)
    FOR colnum IN ([0], [1], [2], [3], [4], [5])
) AS pvt
ORDER BY rownum;

This produces the following result.

012345
-7900000
68460000
83-2580000
7740-246900
-17-72-9-72-60
64-4748-541811
-4-367-56-34-3
-419078-433864
-60-85-31-83-96-36
-4031-93-626410

In this example, we insert the matrix values into a table, #m, which is in ‘spreadsheet' format, and we use the MATRIX2STRING function to convert the table values into a string format to be used by the MTRIL function.

SELECT *
INTO #m
FROM (
      SELECT -79,-45, 9, 9,-91, -5 UNION ALL
      SELECT 68, 46, 9, 81,-61, 35 UNION ALL
      SELECT 83,-25, 80,-67,-22,-38 UNION ALL
      SELECT 77, 40,-24, 69, 73,-20 UNION ALL
      SELECT -17,-72, -9,-72, -6,-34 UNION ALL
      SELECT 64,-47, 48,-54, 18, 11 UNION ALL
      SELECT -4,-36, 7,-56,-34, -3 UNION ALL
      SELECT -41, 90, 78,-43, 38, 64 UNION ALL
      SELECT -60,-85,-31,-83,-96,-36 UNION ALL
      SELECT -40, 31,-93,-62, 64, 10
      ) n(x0,x1,x2,x3,x4,x5);
 
SELECT [0],[1],[2],[3],[4],[5]
FROM (
      SELECT *
      FROM wct.MATRIX((SELECT wct.MTRIL(wct.MATRIX2STRING('#m','*','',NULL))))
) M PIVOT(
    MAX(ItemValue)
    FOR colnum IN([0],[1],[2],[3],[4],[5])
) AS pvt
ORDER BY rownum;

This produces the following result.

012345
-7900000
68460000
83-2580000
7740-246900
-17-72-9-72-60
64-4748-541811
-4-367-56-34-3
-419078-433864
-60-85-31-83-96-36
-4031-93-626410