Given a lower triangular matrix Mat[][], the task is to store the matrix using row-major mapping.
Lower Triangular Matrix: A Lower Triangular Matrix is a square matrix in which the lower triangular part of a matrix consists of non-zero elements and the upper triangular part consists of 0s. The Lower Triangular Matrix for a 2D matrix Mat[][] is mathematically defined as:
- If i < j, set Mat[i][j] = 0.
- If i >= j, set Mat[i][j] > 0.
Illustration: Below is a 5×5 lower triangular matrix. In general, such matrices can be stored in a 2D array, but when it comes to matrices of large size, it is not a good choice because of its high memory consumption due to the storage of unwanted 0s.Â
Such a matrix can be implemented in an optimized manner.
The efficient way to store the lower triangular matrix of size N:
- Count of non-zero elements = 1 + 2 + 3 + … + N = N * (N + 1) /2.
- Count of 0s = N2 – (N * (N + 1) /2 = (N * (N – 1)/2.
Now let us see how to represent lower triangular matrices in our program. Notice that storing 0s must be avoided to reduce memory consumption. As calculated, for storing non-zero elements, N*(N + 1)/2 space is needed. Taking the above example, N = 5. Array of size 5 * (5 + 1)/2 = 15 is required to store the non-zero elements.
Now, elements of the 2D matrix can be stored in a 1D array, row by row, as shown below:
Apart from storing the elements in an array, a procedure for extracting the element corresponding to the row and column number is also required.
Using Row-Major Mapping for storing lower triangular matrix, the element at index Mat[i][j] can be represented as:
Index of Mat[i][j] matrix in the array A[] = [i*(i – 1)/2 + j – 1]
Below is the implementation of the above approach:
C++
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;Â
// Dimensions of a matrixstatic int N = 5;Â
// Structure of the efficient matrixclass Matrix {Â Â public:Â Â int* A;Â Â int size;};Â
// Function to set the// values in the Matrixvoid Set(Matrix mat, int i, int j, int x){Â Â if (i >= j)Â Â Â Â mat.A[i * (i - 1) / 2 + j - 1] = x;}Â
// Function to store the// values in the Matrixint Get(Matrix mat, int i, int j){Â Â if (i >= j)Â Â Â Â return mat.A[i * (i - 1) / 2 + j - 1];Â Â return 0;}Â
// Function to display the// elements of the matrixvoid Display(Matrix mat){  int i, j;  // Traverse the matrix  for (i = 1; i <= mat.size; i++) {    for (j = 1; j <= mat.size; j++) {      if (i >= j)        cout << mat.A[i * (i - 1) / 2 + j - 1]        << " ";      else        cout << 0 << " ";    }    cout << endl;  }}Â
// Function to generate an efficient matrixMatrix createMat(vector<vector<int> >& Mat){  // Declare efficient Matrix  Matrix mat;  // Initialize the Matrix  mat.size = N;  mat.A = new int[(mat.size * (mat.size + 1)) / 2];  int i, j;  // Set the values in matrix  for (i = 1; i <= mat.size; i++)    for (j = 1; j <= mat.size; j++)      Set(mat, i, j, Mat[i - 1][j - 1]);  // Return the matrix  return mat;}Â
// Driver Codeint main(){  vector<vector<int> > Mat = { { 1, 0, 0, 0, 0 },                              { 1, 2, 0, 0, 0 },                              { 1, 2, 3, 0, 0 },                              { 1, 2, 3, 4, 0 },                              { 1, 2, 3, 4, 5 } };Â
  // Stores the efficient matrix  Matrix mat = createMat(Mat);     // Print the Matrix  Display(mat);  return 0;}Â
// This code is contributed by Tapesh (tapeshdua420) |
C
// C program for the above approach#include <stdio.h>#include <stdlib.h>Â
// Dimensions of a matrixconst int N = 5;Â
// Structure of the efficient matrixstruct Matrix {Â Â Â Â int* A;Â Â Â Â int size;};Â
// Function to set the// values in the Matrixvoid Set(struct Matrix* mat,         int i, int j, int x){    if (i >= j)        mat->A[i * (i - 1) / 2 + j - 1] = x;}Â
// Function to store the// values in the Matrixint Get(struct Matrix mat, int i, int j){Â Â Â Â if (i >= j) {Â Â Â Â Â Â Â Â return mat.A[i * (i - 1) / 2 + j - 1];Â Â Â Â }Â Â Â Â else {Â Â Â Â Â Â Â Â return 0;Â Â Â Â }}Â
// Function to display the// elements of the matrixvoid Display(struct Matrix mat){Â Â Â Â int i, j;Â
    // Traverse the matrix    for (i = 1; i <= mat.size; i++) {        for (j = 1; j <= mat.size; j++) {Â
            if (i >= j) {                printf("%d ",                       mat.A[i * (i - 1) / 2 + j - 1]);            }            else {                printf("0 ");            }        }        printf("\n");    }}Â
// Function to generate an efficient matrixstruct Matrix createMat(int Mat[N][N]){    // Declare efficient Matrix    struct Matrix mat;Â
    // Initialize the Matrix    mat.size = N;    mat.A = (int*)malloc(        mat.size * (mat.size + 1) / 2        * sizeof(int));Â
    int i, j;Â
    // Set the values in matrix    for (i = 1; i <= mat.size; i++) {Â
        for (j = 1; j <= mat.size; j++) {Â
            Set(&mat, i, j, Mat[i - 1][j - 1]);        }    }Â
    // Return the matrix    return mat;}Â
// Driver Codeint main(){    int Mat[5][5] = { { 1, 0, 0, 0, 0 },                      { 1, 2, 0, 0, 0 },                      { 1, 2, 3, 0, 0 },                      { 1, 2, 3, 4, 0 },                      { 1, 2, 3, 4, 5 } };Â
    // Stores the efficient matrix    struct Matrix mat = createMat(Mat);Â
    // Print the Matrix    Display(mat);Â
    return 0;} |
Java
// Java program for the above approachclass GFG{Â Â Â // Dimensions of a matrixstatic int N = 5;Â
// Structure of the efficient matrixstatic class Matrix {Â Â Â Â int[] A;Â Â Â Â int size;};Â
// Function to set the// values in the Matrixstatic void Set(Matrix mat,         int i, int j, int x){    if (i >= j)        mat.A[i * (i - 1) / 2 + j - 1] = x;}Â
// Function to store the// values in the Matrixstatic int Get(Matrix mat, int i, int j){Â Â Â Â if (i >= j) {Â Â Â Â Â Â Â Â return mat.A[i * (i - 1) / 2 + j - 1];Â Â Â Â }Â Â Â Â else {Â Â Â Â Â Â Â Â return 0;Â Â Â Â }}Â
// Function to display the// elements of the matrixstatic void Display(Matrix mat){Â Â Â Â int i, j;Â
    // Traverse the matrix    for (i = 1; i <= mat.size; i++) {        for (j = 1; j <= mat.size; j++) {Â
            if (i >= j) {                System.out.printf("%d ",                       mat.A[i * (i - 1) / 2 + j - 1]);            }            else {                System.out.printf("0 ");            }        }        System.out.printf("\n");    }}Â
// Function to generate an efficient matrixstatic Matrix createMat(int Mat[][]){       // Declare efficient Matrix    Matrix mat = new Matrix();Â
    // Initialize the Matrix    mat.size = N;    mat.A = new int[(mat.size*(mat.size + 1)) / 2];    int i, j;Â
    // Set the values in matrix    for (i = 1; i <= mat.size; i++)    {        for (j = 1; j <= mat.size; j++)        {            Set(mat, i, j, Mat[i - 1][j - 1]);        }    }Â
    // Return the matrix    return mat;}Â
// Driver Codepublic static void main(String[] args){    int Mat[][] = { { 1, 0, 0, 0, 0 },                      { 1, 2, 0, 0, 0 },                      { 1, 2, 3, 0, 0 },                      { 1, 2, 3, 4, 0 },                      { 1, 2, 3, 4, 5 } };Â
    // Stores the efficient matrix    Matrix mat = createMat(Mat);Â
    // Print the Matrix    Display(mat);}}Â
// This code is contributed by 29AjayKumar |
Python3
# Python program for the above approachÂ
# Dimensions of a matrixN = 5Â
# Structure of the efficient matrixclass Matrix:    def __init__(self, size):        self.size = size        self.A = [None] * (self.size)Â
# Function to set the# values in the Matrixdef Set(mat, i, j, x):Â Â Â Â if i >= j:Â Â Â Â Â Â Â Â mat.A[i * (i - 1) // 2 + j - 1] = xÂ
# Function to store the# values in the Matrixdef get(mat, i, j):Â Â Â Â if i >= j:Â Â Â Â Â Â Â Â return mat.A[i * (i - 1) // 2 + j - 1]Â Â Â Â return 0Â
# Function to display the# elements of the matrixdef display(mat):    # Traverse the matrix    for i in range(1, mat.size + 1):        for j in range(1, mat.size + 1):            if i >= j:                print(mat.A[i * (i - 1) // 2 + j - 1], end=" ")            else:                print(0, end=" ")        print()Â
# Function to generate an efficient matrixdef create_matrix(Mat):    # Declare efficient Matrix    mat = Matrix(N)    # Initialize the Matrix    mat.A = [None] * ((mat.size * (mat.size+1)) // 2)    # Set the values in matrix    for i in range(1, mat.size + 1):        for j in range(1, mat.size + 1):            Set(mat, i, j, Mat[i - 1][j - 1])    # Return the matrix    return matÂ
Â
if __name__ == '__main__':Â
    Mat = [[1, 0, 0, 0, 0],           [1, 2, 0, 0, 0],           [1, 2, 3, 0, 0],           [1, 2, 3, 4, 0],           [1, 2, 3, 4, 5]]Â
    mat = create_matrix(Mat)    display(mat)Â
# This code is contributed by Tapesh (tapeshdua420) |
C#
// C# program for the above approachusing System;public class GFG{Â
  // Dimensions of a matrix  static int N = 5;Â
  // Structure of the efficient matrix  class Matrix {    public int[] A;    public int size;  };Â
  // Function to set the  // values in the Matrix  static void Set(Matrix mat,                  int i, int j, int x)  {    if (i >= j)      mat.A[i * (i - 1) / 2 + j - 1] = x;  }Â
  // Function to store the  // values in the Matrix  static int Get(Matrix mat, int i, int j)  {    if (i >= j) {      return mat.A[i * (i - 1) / 2 + j - 1];    }    else {      return 0;    }  }Â
  // Function to display the  // elements of the matrix  static void Display(Matrix mat)  {    int i, j;Â
    // Traverse the matrix    for (i = 1; i <= mat.size; i++) {      for (j = 1; j <= mat.size; j++) {Â
        if (i >= j) {          Console.Write("{0} ",                        mat.A[i * (i - 1) / 2 + j - 1]);        }        else {          Console.Write("0 ");        }      }      Console.Write("\n");    }  }Â
  // Function to generate an efficient matrix  static Matrix createMat(int [,]Mat)  {Â
    // Declare efficient Matrix    Matrix mat = new Matrix();Â
    // Initialize the Matrix    mat.size = N;    mat.A = new int[(mat.size*(mat.size + 1)) / 2];    int i, j;Â
    // Set the values in matrix    for (i = 1; i <= mat.size; i++)    {      for (j = 1; j <= mat.size; j++)      {        Set(mat, i, j, Mat[i - 1,j - 1]);      }    }Â
    // Return the matrix    return mat;  }Â
  // Driver Code  public static void Main(String[] args)  {    int [,]Mat = { { 1, 0, 0, 0, 0 },                  { 1, 2, 0, 0, 0 },                  { 1, 2, 3, 0, 0 },                  { 1, 2, 3, 4, 0 },                  { 1, 2, 3, 4, 5 } };Â
    // Stores the efficient matrix    Matrix mat = createMat(Mat);Â
    // Print the Matrix     Display(mat);  }}Â
// This code is contributed by 29AjayKumar |
Javascript
// JavaScript program for the above approachÂ
let N = 5;Â
class Matrix{Â Â Â Â A = new Array();Â Â Â Â size;Â Â Â Â constructor(){ }}Â
function Set(mat, i, j, x){Â Â Â Â if (i >= j){Â Â Â Â Â Â Â Â mat.A[i * (i - 1) / 2 + j - 1] = x;Â Â Â Â }}Â
function Get(mat, i, j){Â Â Â Â if (i >= j) {Â Â Â Â Â Â Â Â return mat.A[i * (i - 1) / 2 + j - 1];Â Â Â Â }Â Â Â Â else {Â Â Â Â Â Â Â Â return 0;Â Â Â Â }}Â
function Display(mat){    let i, j;         // Traverse the matrix    for (i = 1; i <= mat.size; i++) {        for (j = 1; j <= mat.size; j++) {Â
            if (i >= j) {                console.log(mat.A[i * (i - 1) / 2 + j - 1] + " ");            }            else {                console.log("0 ");            }        }        console.log("<br>");    }}Â
function createMat(Mat){    var mat = new Matrix();         mat.size = N;         mat.A = new Array((mat.size*(mat.size + 1))/2);    let i, j;         // Set the values in matrix    for (i = 1; i <= mat.size; i++)    {        for (j = 1; j <= mat.size; j++)        {            Set(mat, i, j, Mat[i - 1][j - 1]);        }    }Â
    // Return the matrix    return mat;}Â
let Mat = [ [1, 0, 0, 0, 0],               [1, 2, 0, 0, 0],               [1, 2, 3, 0, 0],               [1, 2, 3, 4, 0],               [1, 2, 3, 4, 5] ];Â
var mat = createMat(Mat);Display(mat);Â
// This code is contributed by lokesh. |
Â
Â
1 0 0 0 0 1 2 0 0 0 1 2 3 0 0 1 2 3 4 0 1 2 3 4 5
Â
Â
Time Complexity: O(N2)
Auxiliary Space: O(N2)Â
Â
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!


… [Trackback]
[…] Here you can find 10360 more Information on that Topic: geeksforgeeks.org/efficient-method-to-store-a-lower-triangular-matrix-using-row-major-mapping/ […]