Calculating Adjoint (Adjugate) of a NxN Matrix via MS SQL Server

Purpose: Calculation of determinant, adjoint and inverse of a matrix is essential when conducting multivariate analysis. We already discussed how to calculate the determinant value of a NxN matrix previously (click here). For this session, we will discuss how to leverage function in MS SQL Server to get the adjoint of a NxN matrix.

How to calculate Adjoint of a Matrix

Steps:

1. We will need the determinant function ([Matrix].[determinant]) we built previously (click here) to calculate each elements of adjoint matrix and function named [Matrix].[determinant_temp_function]  to redefine the row and col number after selecting the first element of each row.


2.  Create a function called [Matrix].[Adjoint] to have

- Input: Matrix as table type (MatrixTableType)
- Output: Adjoint Matrix as table type (MatrixTableType)
- Define i, j, iMax, jMax, and sign to control loop to calculate each element of decreasing matrix and transpose part.

CREATE FUNCTION [Matrix].[Adjoint]
(
      @input AS Matrix.MatrixTableType READONLY
)
RETURNS @output TABLE   
(  
     i INT,
     j INT,
     value FLOAT
)  
  
AS
BEGIN

DECLARE @i INT
DECLARE @j INT
DECLARE @iMAX INT
DECLARE @jMAX INT
DECLARE @sign INT
DECLARE @value_Adj FLOAT
DECLARE @table_cofactor Matrix.MatrixTableType

SET @i = 1
SET @j = 1
SET @sign = 1

SET @iMAX = (select max(i) from @input)
SET @jMAX = (select max(j) from @input)

IF (@iMAX = 1 AND @jMAX = 1)
BEGIN
 Delete @output
 INSERT INTO  @output SELECT * from @input
END

WHILE (@i <= @iMAX )
BEGIN
  WHILE (@j <= @jMAX )
   BEGIN
   SET @value_Adj = 0 
   Delete @table_cofactor
   INSERT INTO @table_cofactor (i,j,value) SELECT i,j,value FROM  Matrix.[determinant_temp_function]  (@i, @j, @input) 
   SEt @value_Adj = (SELECT [Matrix].[determinant] ( @table_cofactor))
   SET @sign = iif((@i+@j) %2 = 0, @sign, -@sign)
   INSERT INTO  @output (i,j,value) SELECT @j, @i, @value_Adj  * @sign 
   SET @sign = 1
   SET @j = @j +  1
  END 
    Set @j = 1
 SET @i = @i +  1
END

RETURN 
END;

3. Test part (Input & Output)

(Input)

(Output)



DELETE Matrix.[Determinant_MainTable]
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (1,1,5)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (1,2,-2)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (1,3,2)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (1,4,7)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (2,1,1)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (2,2,0)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (2,3,0)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (2,4,3)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (3,1,-3)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (3,2,1)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (3,3,5)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (3,4,0)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (4,1,3)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (4,2,-1)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (4,3,-9)
INSERT INTO Matrix.[Determinant_MainTable]
VALUES (4,4,4)


DECLARE @tableinput  Matrix.MatrixTableType 
INSERT INTO @tableinput 
SELECT * FROM Matrix.[Determinant_MainTable]

SELECT *  FROM  [Matrix].[Adjoint] (@tableinput)
order by i,j;

Thank you and enjoy it! If you want to support Informula, you can buy us a coffee here :)



Comments