Short Notes on Matrix (2-D Arrays)

Last Updated : 21 Feb, 2026

A matrix is a rectangular arrangement of elements in rows and columns. In programming, it is implemented as a 2-D array, where each element is accessed using two indices [row][column].

Declaration & Initialization:

language

Built-in Functions:

operation

Traversing a Matrix:

Traversing a Matrix (2-D array) means visiting every element using nested loops. Since a matrix has rows and columns, traversal requires:

  • Outer loop - iterate through rows
  • Inner loop - iterate through columns
  • Time Complexity: O(m × n)
C++
#include <bits/stdc++.h>
using namespace std;

void traverserowwise(vector<vector<int>>& matrix, int n, int m) {
    
    // row wise traversal
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}

void traversecolumnwise(vector<vector<int>>& matrix, int n, int m) {

    // column wise traversal
    for(int j = 0; j < m; j++) {
        for(int i = 0; i < n; i++) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {

    int n = 2, m = 3;
    vector<vector<int>> matrix = {{1,2,3}, {4,5,6}};

    traverserowwise(matrix, n, m);
    cout << endl;

    traversecolumnwise(matrix, n, m);

    return 0;
}
Java
import java.util.*;

class GfG {

    public void traverserowwise(int[][] matrix, int n, int m) {

        // row wise traversal
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                System.out.print(matrix[i][j] + " ");
            }
            System.out.println();
        }
    }

    public void traversecolumnwise(int[][] matrix, int n, int m) {
        
        // column wise traversal
        for(int j = 0; j < m; j++) {
            for(int i = 0; i < n; i++) {
                System.out.print(matrix[i][j] + " ");
            }
            System.out.println();
        }
    }
}

class main {

    public static void main(String[] args) {

        int n = 2, m = 3;
        int[][] matrix = {{1,2,3},{4,5,6}};

        GfG obj = new GfG();

        obj.traverserowwise(matrix, n, m);
        System.out.println();

        obj.traversecolumnwise(matrix, n, m);
    }
}
Python
def traverserowwise(matrix, n, m):
    
    # row wise traversal
    for i in range(n):
        for j in range(m):
            print(matrix[i][j], end=" ")
        print()

def traversecolumnwise(matrix, n, m):

    # column wise traversal
    for j in range(m):
        for i in range(n):
            print(matrix[i][j], end=" ")
        print()

def main():

    n = 2
    m = 3
    matrix = [[1,2,3],[4,5,6]]

    traverserowwise(matrix, n, m)
    print()

    traversecolumnwise(matrix, n, m)

if __name__ == "__main__":
    main()
C#
using System;

class GfG {

    public void traverserowwise(int[,] matrix, int n, int m) {

        // row wise traversal
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                Console.Write(matrix[i,j] + " ");
            }
            Console.WriteLine();
        }
    }

    public void traversecolumnwise(int[,] matrix, int n, int m) {

        // column wise traversal
        for(int j = 0; j < m; j++) {
            for(int i = 0; i < n; i++) {
                Console.Write(matrix[i,j] + " ");
            }
            Console.WriteLine();
        }
    }
}

class main {

    static void Main() {

        int n = 2;
        int m = 3;
        int[,] matrix = { {1,2,3},{4,5,6} };

        GfG obj = new GfG();

        obj.traverserowwise(matrix, n, m);
        Console.WriteLine();

        obj.traversecolumnwise(matrix, n, m);
    }
}
JavaScript
function traverserowwise(matrix, n, m) {
    // row-wise traversal
    for (let i = 0; i < n; i++) {
        let row = "";
        for (let j = 0; j < m; j++) {
            row += matrix[i][j] + " ";
        }
        console.log(row.trim());
    }
}

function traversecolumnwise(matrix, n, m) {
    // column-wise traversal
    for (let j = 0; j < m; j++) {
        let col = "";
        for (let i = 0; i < n; i++) {
            col += matrix[i][j] + " ";
        }
        console.log(col.trim());
    }
}

// driver code
let n = 2;
let m = 3;
let matrix = [[1, 2, 3], [4, 5, 6]];

traverserowwise(matrix, n, m);
console.log();
traversecolumnwise(matrix, n, m);

Output
1 2 3 4 5 6 
1 4 2 5 3 6 

Classical Algorithm and Problem on 2D-Arrays:

1. Matrix Multiplication

Matrix multiplication is a classical matrix problem where each element of the resulting matrix is calculated as the dot product of a row from the first matrix and a column from the second. It combines two matrices to form a new one based on this rule.

Core Idea: For C[i][j], sum the product of corresponding elements from row i of matrix A and column j of matrix B:

C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + ... + A[i][k]*B[k][j]

C++
vector<vector<int>> mult(vector<vector<int>>& arr, vector<vector<int>>& brr) {
    int n = arr.size();

    // to store the resultant matrix
    vector<vector<int>> res(n, vector<int>(n, 0));

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            for(int k = 0; k < n; k++) {
                res[i][j] += arr[i][k] * brr[k][j];
            }
        }
    }

    return res;
}
Java
int[][] multiply(int[][] arr, int[][] brr){
    
    int n = arr.length;

    // to store the resultant matrix
    int[][] res = new int[n][n];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                res[i][j] += arr[i][k] * brr[k][j];
            }
        }
    }

    return res;
}
Python
def multiply(arr, brr):
    n = len(arr)

    # to store the resultant matrix
    res = [[0 for _ in range(n)] for _ in range(n)]

    for i in range(n):
        for j in range(n):
            for k in range(n):
                res[i][j] += arr[i][k] * brr[k][j]

    return res
C#
List<List<int> > multiply(List<List<int> > arr,
                          List<List<int> > brr){

    int n = arr.Count;

    // to store the resultant matrix
    List<List<int> > res = new List<List<int> >();
    for (int i = 0; i < n; i++) {
        List<int> row = new List<int>();
        for (int j = 0; j < n; j++) {
            row.Add(0);
        }
        res.Add(row);
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                res[i][j] += arr[i][k] * brr[k][j];
            }
        }
    }

    return res;
}
JavaScript
function multiply(arr, brr) {
    let n = arr.length;

    // to store the resultant matrix
    let res = new Array(n);
    for (let i = 0; i < n; i++) {
        res[i] = new Array(n).fill(0);
    }

    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            for (let k = 0; k < n; k++) {
                res[i][j] += arr[i][k] * brr[k][j];
            }
        }
    }

    return res;
}

2. Rotate Square Matrix by 90 Degrees

Rotate Square Matrix by 90 Degrees is a classical problem where a square 2D matrix is rotated 90 degrees clockwise. In this transformation, the first row becomes the last column, the second row becomes the second-last column, and so on.


C++
function rotateMatrix(mat) {
    const n = mat.length;

    // Consider all cycles one by one
    for (let i = 0; i < n / 2; i++) {
        
        // Consider elements in group of 4
        // as P1, P2, P3 & P4 in current square
        for (let j = i; j < n - i - 1; j++) {

            let temp = mat[i][j];
            mat[i][j] = mat[j][n - 1 - i];
            mat[j][n - 1 - i] = mat[n - 1 - i][n - 1 - j];
            mat[n - 1 - i][n - 1 - j] = mat[n - 1 - j][i];
            mat[n - 1 - j][i] = temp;
        }
    }
}
Java
void rotateMatrix(int[][] mat)
{
    int n = mat.length;

    // Consider all cycles one by one
    for (int i = 0; i < n / 2; i++) {

        // Consider elements in group of 4
        // as P1, P2, P3 & P4 in current square
        for (int j = i; j < n - i - 1; j++) {
            int temp = mat[i][j];
            mat[i][j] = mat[j][n - 1 - i];
            mat[j][n - 1 - i] = mat[n - 1 - i][n - 1 - j];
            mat[n - 1 - i][n - 1 - j] = mat[n - 1 - j][i];
            mat[n - 1 - j][i] = temp;
        }
    }
}
Python
def rotateMatrix(mat):
    n = len(mat)

    # Consider all cycles one by one
    for i in range(n // 2):

        # Consider elements in group of 4
        # as P1, P2, P3 & P4 in current square
        for j in range(i, n - i - 1):

            temp = mat[i][j]
            mat[i][j] = mat[j][n - 1 - i]
            mat[j][n - 1 - i] = mat[n - 1 - i][n - 1 - j]
            mat[n - 1 - i][n - 1 - j] = mat[n - 1 - j][i]
            mat[n - 1 - j][i] = temp
C#
void rotateMatrix(int[][] mat)
{

    int n = mat.Length;

    // Consider all cycles one by one
    for (int i = 0; i < n / 2; i++) {

        // Consider elements in group of 4
        // as P1, P2, P3 & P4 in current square
        for (int j = i; j < n - i - 1; j++) {

            int temp = mat[i][j];
            mat[i][j] = mat[j][n - 1 - i];
            mat[j][n - 1 - i] = mat[n - 1 - i][n - 1 - j];
            mat[n - 1 - i][n - 1 - j] = mat[n - 1 - j][i];
            mat[n - 1 - j][i] = temp;
        }
    }
JavaScript
function rotateMatrix(mat)
{
    const n = mat.length;

    // Consider all cycles one by one
    for (let i = 0; i < n / 2; i++) {

        // Consider elements in group of 4
        // as P1, P2, P3 & P4 in current square
        for (let j = i; j < n - i - 1; j++) {

            let temp = mat[i][j];
            mat[i][j] = mat[j][n - 1 - i];
            mat[j][n - 1 - i] = mat[n - 1 - i][n - 1 - j];
            mat[n - 1 - i][n - 1 - j] = mat[n - 1 - j][i];
            mat[n - 1 - j][i] = temp;
        }
    }
}

3. Transpose of a Matrix

Transpose of a matrix is a classical matrix problem that involves flipping the matrix over its main diagonal, converting rows into columns. The element at matrix[i][j] is moved to matrix[j][i].

Core Idea: Swap elements matrix[i][j] and matrix[j][i] for all i < j to flip the matrix over its main diagonal without using extra space.

C++
function transpose(mat)
{
    const rows = mat.length;
    const cols = mat[0].length;

    // Create a result matrix of size
    // cols x rows for the transpose
    const tMat = new Array(cols).fill(0).map(() = > new Array(rows).fill(0));

    // Fill the transposed matrix by
    // swapping rows with columns
    for (let i = 0; i < rows; i++)
    {
        for (let j = 0; j < cols; j++)
        {

            // Assign transposed value
            tMat[j][i] = mat[i][j];
        }
    }

    return tMat;
}
Java
ArrayList<ArrayList<Integer> > transpose(int[][] mat)
{

    int rows = mat.length;
    int cols = mat[0].length;

    // Create a result matrix of size
    // cols x rows for the transpose
    ArrayList<ArrayList<Integer> > tMat = new ArrayList<>();

    // Fill the transposed matrix by
    // swapping rows with columns
    for (int i = 0; i < cols; i++) {
        ArrayList<Integer> row = new ArrayList<>();
        for (int j = 0; j < rows; j++) {
            // Assign transposed value
            row.add(mat[j][i]);
        }
        tMat.add(row);
    }

    return tMat;
}
Python
def transpose(mat):
    rows = len(mat)
    cols = len(mat[0])

    # Create a result matrix of size
    # cols x rows for the transpose
    tMat = [[0 for _ in range(rows)] for _ in range(cols)]

    # Fill the transposed matrix by
    # swapping rows with columns
    for i in range(rows):
        for j in range(cols):

            # Assign transposed value
            tMat[j][i] = mat[i][j]

    return tMat
C#
List<List<int> > transpose(int[, ] mat)
{
    int rows = mat.GetLength(0);
    int cols = mat.GetLength(1);

    // Create a result matrix of size
    // cols x rows for the transpose
    List<List<int> > tMat = new List<List<int> >();

    // Fill the transposed matrix by
    // swapping rows with columns
    for (int j = 0; j < cols; j++) {
        List<int> row = new List<int>();
        for (int i = 0; i < rows; i++) {

            // Assign transposed value
            row.Add(mat[i, j]);
        }
        tMat.Add(row);
    }

    return tMat;
}
JavaScript
function transpose(mat)
{
    const rows = mat.length;
    const cols = mat[0].length;

    // Create a result matrix of size
    // cols x rows for the transpose
    const tMat = new Array(cols).fill(0).map(
        () => new Array(rows).fill(0));

    // Fill the transposed matrix by
    // swapping rows with columns
    for (let i = 0; i < rows; i++) {
        for (let j = 0; j < cols; j++) {

            // Assign transposed value
            tMat[j][i] = mat[i][j];
        }
    }

    return tMat;
}

4. Spiral Traversal

Spiral traversal is the classical matrix problem where elements are accessed in a spiral order starting from the top-left corner.The traversal moves right → down → left → up layer by layer until all elements are visited.

Core Idea: Traverse the matrix layer by layer, adjusting boundaries to follow a directional pattern, ensuring no element is visited twice.

C++
vector<int> spirallyTraverse(vector<vector<int>> &mat)
{
    int m = mat.size();
    int n = mat[0].size();

    vector<int> res;

    // Initialize boundaries
    int top = 0, bottom = m - 1, left = 0, right = n - 1;

    // Iterate until all elements are Stored
    while (top <= bottom && left <= right)
    {

        // Store top row from left to right
        for (int i = left; i <= right; ++i)
        {
            res.push_back(mat[top][i]);
        }
        top++;

        // Store right column from top to bottom
        for (int i = top; i <= bottom; ++i)
        {
            res.push_back(mat[i][right]);
        }
        right--;

        // Store bottom row from right to left (if exists)
        if (top <= bottom)
        {
            for (int i = right; i >= left; --i)
            {
                res.push_back(mat[bottom][i]);
            }
            bottom--;
        }

        // Store left column from bottom to top (if exists)
        if (left <= right)
        {
            for (int i = bottom; i >= top; --i)
            {
                res.push_back(mat[i][left]);
            }
            left++;
        }
    }
    return res;
}
Java
ArrayList<Integer> spirallyTraverse(int[][] mat)
{
    int m = mat.length;
    int n = mat[0].length;

    ArrayList<Integer> res = new ArrayList<>();

    // Initialize boundaries
    int top = 0, bottom = m - 1, left = 0, right = n - 1;

    // Iterate until all elements are Stored
    while (top <= bottom && left <= right) {

        // Store top row from left to right
        for (int i = left; i <= right; ++i) {
            res.add(mat[top][i]);
        }
        top++;

        // Store right column from top to bottom
        for (int i = top; i <= bottom; ++i) {
            res.add(mat[i][right]);
        }
        right--;

        // Store bottom row from right to left (if exists)
        if (top <= bottom) {
            for (int i = right; i >= left; --i) {
                res.add(mat[bottom][i]);
            }
            bottom--;
        }

        // Store left column from bottom to top (if exists)
        if (left <= right) {
            for (int i = bottom; i >= top; --i) {
                res.add(mat[i][left]);
            }
            left++;
        }
    }

    return res;
}
Python
def spirallyTraverse(mat):
    m, n = len(mat), len(mat[0])

    res = []

    # Initialize boundaries
    top, bottom, left, right = 0, m - 1, 0, n - 1

    # Iterate until all elements are Stored
    while top <= bottom and left <= right:Store

        # Store top row from left to right
        for i in range(left, right + 1):
            res.append(mat[top][i])
        top += 1

        # Store right column from top to bottom
        for i in range(top, bottom + 1):
            res.append(mat[i][right])
        right -= 1

        # Store bottom row from right to left (if exists)
        if top <= bottom:
            for i in range(right, left - 1, -1):
                res.append(mat[bottom][i])
            bottom -= 1

        # Store left column from bottom to top (if exists)
        if left <= right:
            for i in range(bottom, top - 1, -1):
                res.append(mat[i][left])
            left += 1

    return res
C#
List<int> spirallyTraverse(int[, ] mat)
{
    int m = mat.GetLength(0);
    int n = mat.GetLength(1);

    List<int> res = new List<int>();

    // Initialize boundaries
    int top = 0, bottom = m - 1, left = 0, right = n - 1;

    // Iterate until all elements are Stored
    while (top <= bottom && left <= right) {

        // Store top row from left to right
        for (int i = left; i <= right; ++i) {
            res.Add(mat[top, i]);
        }
        top++;

        // Store right column from top to bottom
        for (int i = top; i <= bottom; ++i) {
            res.Add(mat[i, right]);
        }
        right--;

        // Store bottom row from right to left (if exists)
        if (top <= bottom) {
            for (int i = right; i >= left; --i) {
                res.Add(mat[bottom, i]);
            }
            bottom--;
        }

        // Store left column from bottom to top (if exists)
        if (left <= right) {
            for (int i = bottom; i >= top; --i) {
                res.Add(mat[i, left]);
            }
            left++;
        }
    }

    return res;
}
JavaScript
function spirallyTraverse(mat)
{
    const m = mat.length;
    const n = mat[0].length;

    const res = [];

    // Initialize boundaries
    let top = 0, bottom = m - 1, left = 0, right = n - 1;

    // Iterate until all elements are Stored
    while (top <= bottom && left <= right) {

        // Store top row from left to right
        for (let i = left; i <= right; ++i) {
            res.push(mat[top][i]);
        }
        top++;

        // Store right column from top to bottom
        for (let i = top; i <= bottom; ++i) {
            res.push(mat[i][right]);
        }
        right--;

        // Store bottom row from right to left (if exists)
        if (top <= bottom) {
            for (let i = right; i >= left; --i) {
                res.push(mat[bottom][i]);
            }
            bottom--;
        }

        // Store left column from bottom to top (if exists)
        if (left <= right) {
            for (let i = bottom; i >= top; --i) {
                res.push(mat[i][left]);
            }
            left++;
        }
    }

    return res;
}
Comment