Open In App

Adjoint and Inverse of a Matrix

Given a square matrix, find the adjoint and inverse of the matrix. 
We strongly recommend you to refer below as a prerequisite for this. 

Determinant of a Matrix

Adjoint (or Adjugate) of a matrix is the matrix obtained by taking the transpose of the cofactor matrix of a given square matrix is called its Adjoint or Adjugate matrix. The Adjoint of any square matrix ‘A’ (say) is represented as Adj(A). 

Example: 

Below example and explanation are taken from here.
5 -2 2 7
1 0 0 3
-3 1 5 0
3 -1 -9 4

For instance, the cofactor of the top left corner '5' is
+ |0 0 3|
...|1 5 0| = 3(1 * -9 - (-1) * 5) = -12.
...|-1 -9 4|
(The minor matrix is formed by deleting the row
and column of the given entry.)

As another sample, the cofactor of the top row corner '-2' is
-|1 0 3|
...|-3 5 0| = - [1 (20 - 0) - 0 + 3 (27 - 15)] = -56.
...|3 -9 4|

Proceeding like this, we obtain the matrix
[-12 -56 4 4]
[76 208 4 4]
[-60 -82 -2 20]
[-36 -58 -10 12]

Finally, to get the adjoint, just take the previous
matrix's transpose:
[-12 76 -60 -36]
[-56 208 -82 -58]
[4 4 -2 -10]
[4 4 20 12]

Important properties: 

Product of a square matrix A with its adjoint yields a diagonal matrix, where each diagonal entry is equal to determinant of A. 
i.e. 

A.adj(A) = det(A).I 

I => Identity matrix of same order as of A.
det(A) => Determinant value of A

A non-zero square matrix ‘A’ of order n is said to be invertible if there exists a unique square matrix ‘B’ of order n such that,

   A.B = B.A = I
The matrix 'B' is said to be inverse of 'A'.
i.e., B = A-1

How to find Adjoint? 

We follow the definition given above. 

Let A[N][N] be input matrix.

1) Create a matrix adj[N][N] store the adjoint matrix.
2) For every entry A[i][j] in input matrix where 0 <= i < N
and 0 <= j < N.
a) Find cofactor of A[i][j]
b) Find sign of entry. Sign is + if (i+j) is even else
sign is odd.
c) Place the cofactor at adj[j][i]

How to find Inverse? 

Inverse of a matrix exists only if the matrix is non-singular i.e., determinant should not be 0. 
Using determinant and adjoint, we can easily find the inverse of a square matrix using the below formula,

  If det(A) != 0
A-1 = adj(A)/det(A)
Else
"Inverse doesn't exist"

Inverse is used to find the solution to a system of linear equations.

Below are implementations for finding adjoint and inverse of a matrix.  




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
int dp[100][3];
 
// Function to find the maximum sum of
// subsequence with consecutive terms
// having different parity
int maxSum(int* arr, int i, int n,
        int prev, bool is_selected)
{
    // Base Case
    if (i == n) {
        return 0;
    }
 
    // Store the parity of number at
    // the ith position
    int cur = abs(arr[i]) % 2;
 
    // If the dp state has already been
    // calculated, return it
    if (dp[i][prev] != -1) {
        return dp[i][prev];
    }
 
    // If the array is traversed and
    // no element has been selected yet
    // then select the current element
    if (i == n - 1 && is_selected == 0)
        return dp[i][prev] = arr[i];
 
    // If the parity of the current and
    // previously selected element are
    // different, then select the
    // current element
    if (cur != prev) {
        dp[i][prev] = arr[i]
                    + maxSum(arr, i + 1,
                            n, cur, 1);
    }
 
    // Skip the current element and move
    // to the next element
    dp[i][prev]
        = max(dp[i][prev],
            maxSum(arr, i + 1, n,
                    prev, is_selected));
 
    // Return the result
    return dp[i][prev];
}
 
// Function to calculate the maximum sum
// subsequence with consecutive terms
// having different parity
void maxSumUtil(int arr[], int n)
{
 
    // Initialize the dp[] array with -1
    memset(dp, -1, sizeof(dp));
 
    // Initially the prev value is set to
    // say 2, as the first element can
    // anyways be selected
    cout << maxSum(arr, 0, n, 2, 0);
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 2, 6, 8, -5, 10 };
    int N = sizeof(arr) / sizeof(arr[0]);
    maxSumUtil(arr, N);
 
    return 0;
}




// Java program to find adjoint and inverse of a matrix
class GFG
{
     
static final int N = 4;
 
// Function to get cofactor of A[p][q] in temp[][]. n is current
// dimension of A[][]
static void getCofactor(int A[][], int temp[][], int p, int q, int n)
{
    int i = 0, j = 0;
 
    // Looping for each element of the matrix
    for (int row = 0; row < n; row++)
    {
        for (int col = 0; col < n; col++)
        {
            // Copying into temporary matrix only those element
            // which are not in given row and column
            if (row != p && col != q)
            {
                temp[i][j++] = A[row][col];
 
                // Row is filled, so increase row index and
                // reset col index
                if (j == n - 1)
                {
                    j = 0;
                    i++;
                }
            }
        }
    }
}
 
/* Recursive function for finding determinant of matrix.
n is current dimension of A[][]. */
static int determinant(int A[][], int n)
{
    int D = 0; // Initialize result
 
    // Base case : if matrix contains single element
    if (n == 1)
        return A[0][0];
 
    int [][]temp = new int[N][N]; // To store cofactors
 
    int sign = 1; // To store sign multiplier
 
    // Iterate for each element of first row
    for (int f = 0; f < n; f++)
    {
        // Getting Cofactor of A[0][f]
        getCofactor(A, temp, 0, f, n);
        D += sign * A[0][f] * determinant(temp, n - 1);
 
        // terms are to be added with alternate sign
        sign = -sign;
    }
 
    return D;
}
 
// Function to get adjoint of A[N][N] in adj[N][N].
static void adjoint(int A[][],int [][]adj)
{
    if (N == 1)
    {
        adj[0][0] = 1;
        return;
    }
 
    // temp is used to store cofactors of A[][]
    int sign = 1;
    int [][]temp = new int[N][N];
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            // Get cofactor of A[i][j]
            getCofactor(A, temp, i, j, N);
 
            // sign of adj[j][i] positive if sum of row
            // and column indexes is even.
            sign = ((i + j) % 2 == 0)? 1: -1;
 
            // Interchanging rows and columns to get the
            // transpose of the cofactor matrix
            adj[j][i] = (sign)*(determinant(temp, N-1));
        }
    }
}
 
// Function to calculate and store inverse, returns false if
// matrix is singular
static boolean inverse(int A[][], float [][]inverse)
{
    // Find determinant of A[][]
    int det = determinant(A, N);
    if (det == 0)
    {
        System.out.print("Singular matrix, can't find its inverse");
        return false;
    }
 
    // Find adjoint
    int [][]adj = new int[N][N];
    adjoint(A, adj);
 
    // Find Inverse using formula "inverse(A) = adj(A)/det(A)"
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            inverse[i][j] = adj[i][j]/(float)det;
 
    return true;
}
 
// Generic function to display the matrix. We use it to display
// both adjoin and inverse. adjoin is integer matrix and inverse
// is a float.
 
static void display(int A[][])
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            System.out.print(A[i][j]+ " ");
        System.out.println();
    }
}
static void display(float A[][])
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            System.out.printf("%.6f ",A[i][j]);
        System.out.println();
    }
}
 
// Driver program
public static void main(String[] args)
{
    int A[][] = { {5, -2, 2, 7},
                    {1, 0, 0, 3},
                    {-3, 1, 5, 0},
                    {3, -1, -9, 4}};
 
    int [][]adj = new int[N][N]; // To store adjoint of A[][]
 
    float [][]inv = new float[N][N]; // To store inverse of A[][]
 
    System.out.print("Input matrix is :\n");
    display(A);
 
    System.out.print("\nThe Adjoint is :\n");
    adjoint(A, adj);
    display(adj);
 
    System.out.print("\nThe Inverse is :\n");
    if (inverse(A, inv))
        display(inv);
 
}
}
 
// This code is contributed by Rajput-Ji




# Python3 program to find adjoint and
# inverse of a matrix
N = 4
 
# Function to get cofactor of
# A[p][q] in temp[][]. n is current
# dimension of A[][]
def getCofactor(A, temp, p, q, n):
 
    i = 0
    j = 0
 
    # Looping for each element of the matrix
    for row in range(n):
 
        for col in range(n):
 
            # Copying into temporary matrix only those element
            # which are not in given row and column
            if (row != p and col != q):
 
                temp[i][j] = A[row][col]
                j += 1
 
                # Row is filled, so increase row index and
                # reset col index
                if (j == n - 1):
                    j = 0
                    i += 1
 
 
# Recursive function for finding determinant of matrix.
#  n is current dimension of A[][].
def determinant(A, n):
 
    D = 0   # Initialize result
 
    # Base case : if matrix contains single element
    if (n == 1):
        return A[0][0]
 
    temp = []   # To store cofactors
    for i in range(N):
        temp.append([None for _ in range(N)])
 
    sign = 1   # To store sign multiplier
 
    # Iterate for each element of first row
    for f in range(n):
 
        # Getting Cofactor of A[0][f]
        getCofactor(A, temp, 0, f, n)
        D += sign * A[0][f] * determinant(temp, n - 1)
 
        # terms are to be added with alternate sign
        sign = -sign
 
    return D
 
 
# Function to get adjoint of A[N][N] in adj[N][N].
def adjoint(A, adj):
 
    if (N == 1):
        adj[0][0] = 1
        return
 
    # temp is used to store cofactors of A[][]
    sign = 1
    temp = []   # To store cofactors
    for i in range(N):
        temp.append([None for _ in range(N)])
 
    for i in range(N):
        for j in range(N):
            # Get cofactor of A[i][j]
            getCofactor(A, temp, i, j, N)
 
            # sign of adj[j][i] positive if sum of row
            # and column indexes is even.
            sign = [1, -1][(i + j) % 2]
 
            # Interchanging rows and columns to get the
            # transpose of the cofactor matrix
            adj[j][i] = (sign)*(determinant(temp, N-1))
 
 
# Function to calculate and store inverse, returns false if
# matrix is singular
def inverse(A, inverse):
 
    # Find determinant of A[][]
    det = determinant(A, N)
    if (det == 0):
        print("Singular matrix, can't find its inverse")
        return False
 
    # Find adjoint
    adj = []
    for i in range(N):
        adj.append([None for _ in range(N)])
    adjoint(A, adj)
 
    # Find Inverse using formula "inverse(A) = adj(A)/det(A)"
    for i in range(N):
        for j in range(N):
            inverse[i][j] = adj[i][j] / det
 
    return True
 
 
# Generic function to display the
# matrix. We use it to display
# both adjoin and inverse. adjoin
# is integer matrix and inverse
# is a float.
def display(A):
    for i in range(N):
        for j in range(N):
            print(A[i][j], end=" ")
        print()
 
 
def displays(A):
    for i in range(N):
        for j in range(N):
            print(round(A[i][j], 6), end=" ")
        print()
 
 
# Driver program
 
A = [[5, -2, 2, 7], [1, 0, 0, 3], [-3, 1, 5, 0], [3, -1, -9, 4]]
adj = [None for _ in range(N)]
inv = [None for _ in range(N)]
 
for i in range(N):
    adj[i] = [None for _ in range(N)]
    inv[i] = [None for _ in range(N)]
 
 
print("Input matrix is :")
display(A)
 
print("\nThe Adjoint is :")
adjoint(A, adj)
display(adj)
 
print("\nThe Inverse is :")
if (inverse(A, inv)):
    displays(inv)
 
# This code is contributed by phasing17




// C# program to find adjoint and inverse of a matrix
using System;
using System.Collections.Generic;
 
class GFG
{
     
static readonly int N = 4;
 
// Function to get cofactor of A[p,q] in [,]temp. n is current
// dimension of [,]A
static void getCofactor(int [,]A, int [,]temp, int p, int q, int n)
{
    int i = 0, j = 0;
 
    // Looping for each element of the matrix
    for (int row = 0; row < n; row++)
    {
        for (int col = 0; col < n; col++)
        {
            // Copying into temporary matrix only those element
            // which are not in given row and column
            if (row != p && col != q)
            {
                temp[i, j++] = A[row, col];
 
                // Row is filled, so increase row index and
                // reset col index
                if (j == n - 1)
                {
                    j = 0;
                    i++;
                }
            }
        }
    }
}
 
/* Recursive function for finding determinant of matrix.
n is current dimension of [,]A. */
static int determinant(int [,]A, int n)
{
    int D = 0; // Initialize result
 
    // Base case : if matrix contains single element
    if (n == 1)
        return A[0, 0];
 
    int [,]temp = new int[N, N]; // To store cofactors
 
    int sign = 1; // To store sign multiplier
 
    // Iterate for each element of first row
    for (int f = 0; f < n; f++)
    {
        // Getting Cofactor of A[0,f]
        getCofactor(A, temp, 0, f, n);
        D += sign * A[0, f] * determinant(temp, n - 1);
 
        // terms are to be added with alternate sign
        sign = -sign;
    }
    return D;
}
 
// Function to get adjoint of A[N,N] in adj[N,N].
static void adjoint(int [,]A, int [,]adj)
{
    if (N == 1)
    {
        adj[0, 0] = 1;
        return;
    }
 
    // temp is used to store cofactors of [,]A
    int sign = 1;
    int [,]temp = new int[N, N];
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            // Get cofactor of A[i,j]
            getCofactor(A, temp, i, j, N);
 
            // sign of adj[j,i] positive if sum of row
            // and column indexes is even.
            sign = ((i + j) % 2 == 0)? 1: -1;
 
            // Interchanging rows and columns to get the
            // transpose of the cofactor matrix
            adj[j, i] = (sign) * (determinant(temp, N - 1));
        }
    }
}
 
// Function to calculate and store inverse, returns false if
// matrix is singular
static bool inverse(int [,]A, float [,]inverse)
{
    // Find determinant of [,]A
    int det = determinant(A, N);
    if (det == 0)
    {
        Console.Write("Singular matrix, can't find its inverse");
        return false;
    }
 
    // Find adjoint
    int [,]adj = new int[N, N];
    adjoint(A, adj);
 
    // Find Inverse using formula "inverse(A) = adj(A)/det(A)"
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            inverse[i, j] = adj[i, j]/(float)det;
 
    return true;
}
 
// Generic function to display the matrix. We use it to display
// both adjoin and inverse. adjoin is integer matrix and inverse
// is a float.
static void display(int [,]A)
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            Console.Write(A[i, j]+ " ");
        Console.WriteLine();
    }
}
static void display(float [,]A)
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            Console.Write("{0:F6} ", A[i, j]);
        Console.WriteLine();
    }
}
 
// Driver program
public static void Main(String[] args)
{
    int [,]A = { {5, -2, 2, 7},
                    {1, 0, 0, 3},
                    {-3, 1, 5, 0},
                    {3, -1, -9, 4}};
 
    int [,]adj = new int[N, N]; // To store adjoint of [,]A
 
    float [,]inv = new float[N, N]; // To store inverse of [,]A
 
    Console.Write("Input matrix is :\n");
    display(A);
 
    Console.Write("\nThe Adjoint is :\n");
    adjoint(A, adj);
    display(adj);
 
    Console.Write("\nThe Inverse is :\n");
    if (inverse(A, inv))
        display(inv);
}
}
 
// This code is contributed by 29AjayKumar




<script>
 
// JavaScript program to find adjoint and
// inverse of a matrix
 
let N = 4;
// Function to get cofactor of
// A[p][q] in temp[][]. n is current
// dimension of A[][]
function getCofactor(A,temp,p,q,n)
{
    let i = 0, j = 0;
   
    // Looping for each element of the matrix
    for (let row = 0; row < n; row++)
    {
        for (let col = 0; col < n; col++)
        {
            // Copying into temporary matrix only those element
            // which are not in given row and column
            if (row != p && col != q)
            {
                temp[i][j++] = A[row][col];
   
                // Row is filled, so increase row index and
                // reset col index
                if (j == n - 1)
                {
                    j = 0;
                    i++;
                }
            }
        }
    }
}
 
/* Recursive function for finding determinant of matrix.
n is current dimension of A[][]. */
function determinant(A,n)
{
    let D = 0; // Initialize result
   
    // Base case : if matrix contains single element
    if (n == 1)
        return A[0][0];
   
    let temp = new Array(N);// To store cofactors
    for(let i=0;i<N;i++)
    {
        temp[i]=new Array(N);
    }
   
    let sign = 1; // To store sign multiplier
   
    // Iterate for each element of first row
    for (let f = 0; f < n; f++)
    {
        // Getting Cofactor of A[0][f]
        getCofactor(A, temp, 0, f, n);
        D += sign * A[0][f] * determinant(temp, n - 1);
   
        // terms are to be added with alternate sign
        sign = -sign;
    }
   
    return D;
}
 
// Function to get adjoint of A[N][N] in adj[N][N].
function  adjoint(A,adj)
{
    if (N == 1)
    {
        adj[0][0] = 1;
        return;
    }
   
    // temp is used to store cofactors of A[][]
    let sign = 1;
    let temp = new Array(N);
    for(let i=0;i<N;i++)
    {
        temp[i]=new Array(N);
    }
   
    for (let i = 0; i < N; i++)
    {
        for (let j = 0; j < N; j++)
        {
            // Get cofactor of A[i][j]
            getCofactor(A, temp, i, j, N);
   
            // sign of adj[j][i] positive if sum of row
            // and column indexes is even.
            sign = ((i + j) % 2 == 0)? 1: -1;
   
            // Interchanging rows and columns to get the
            // transpose of the cofactor matrix
            adj[j][i] = (sign)*(determinant(temp, N-1));
        }
    }
}
 
// Function to calculate and store inverse, returns false if
// matrix is singular
function inverse(A,inverse)
{
    // Find determinant of A[][]
    let det = determinant(A, N);
    if (det == 0)
    {
        document.write("Singular matrix, can't find its inverse");
        return false;
    }
   
    // Find adjoint
    let adj = new Array(N);
    for(let i=0;i<N;i++)
    {
        adj[i]=new Array(N);
    }
    adjoint(A, adj);
   
    // Find Inverse using formula "inverse(A) = adj(A)/det(A)"
    for (let i = 0; i < N; i++)
        for (let j = 0; j < N; j++)
            inverse[i][j] = adj[i][j]/det;
   
    return true;
}
 
// Generic function to display the
// matrix. We use it to display
// both adjoin and inverse. adjoin
// is integer matrix and inverse
// is a float.
function display(A)
{
    for (let i = 0; i < N; i++)
    {
        for (let j = 0; j < N; j++)
            document.write(A[i][j]+ " ");
        document.write("<br>");
    }
}
 
 
function displays(A)
{
    for (let i = 0; i < N; i++)
    {
        for (let j = 0; j < N; j++)
            document.write(A[i][j].toFixed(6)+" ");
        document.write("<br>");
    }
}
 
// Driver program
let A=[[5, -2, 2, 7],
                    [1, 0, 0, 3],
                    [-3, 1, 5, 0],
                    [3, -1, -9, 4]];
let adj = new Array(N);
let inv = new Array(N);
 
for(let i=0;i<N;i++)
{
    adj[i]=new Array(N);
    inv[i]=new Array(N);
}
 
document.write("Input matrix is :<br>");
display(A);
 
document.write("<br>The Adjoint is :<br>");
adjoint(A, adj);
display(adj);
 
document.write("<br>The Inverse is :<br>");
if (inverse(A, inv))
    displays(inv);
 
 
 
// This code is contributed by rag2127
 
</script>

Output:

The Adjoint is :
-12 76 -60 -36
-56 208 -82 -58
4 4 -2 -10
4 4 20 12

The Inverse is :
-0.136364 0.863636 -0.681818 -0.409091
-0.636364 2.36364 -0.931818 -0.659091
0.0454545 0.0454545 -0.0227273 -0.113636
0.0454545 0.0454545 0.227273 0.136364

Please refer https://www..geeksforgeeks.org/determinant-of-a-matrix/ for details of getCofactor() and determinant().

 


Article Tags :