Row-wise vs column-wise traversal of matrix - GeeksforGeeks

05 Apr, 2022
Two common ways of traversing a matrix are row-major-order and column-major-order. Row Major Order : When matrix is accessed row by row. Column Major Order : When matrix is accessed column by column.Examples:  
Input : mat[][] = {{1, 2, 3}, 
                  {4, 5, 6}, 
                  {7, 8, 9}}
Output : Row-wise: 1 2 3 4 5 6 7 8 9
         Col-wise : 1 4 7 2 5 8 3 6 9
 
Difference: If we see according to time complexity, both lead to O(n2), but when it comes to cache level one of the orders access will be faster as compare to other one. It depends on the language we are using. Like in C, store matrix in row major form so while accessing the i+1th element after ith, most probably it will lead to a hit, which will further reduce the time of program. Following codes are showing the time difference in row major and column major access.  
C++
Java
Python3
C#
// C program showing time difference// in row major and column major access#include <stdio.h>#include <time.h> // taking MAX 10000 so that time difference// can be shown#define MAX 10000 int arr[MAX][MAX] = {0}; void rowMajor() {   int i, j;   // accessing element row wise  for (i = 0; i < MAX; i++) {    for (j = 0; j < MAX; j++) {      arr[i][j]++;    }  }} void colMajor() {   int i, j;   // accessing element column wise  for (i = 0; i < MAX; i++) {    for (j = 0; j < MAX; j++) {      arr[j][i]++;    }  }} // driver codeint main() {  int i, j;   // Time taken by row major order  clock_t t = clock();  rowMajor();  t = clock() - t;  printf("Row major access time :%f s\n",                t / (float)CLOCKS_PER_SEC);   // Time taken by column major order  t = clock();  colMajor();  t = clock() - t;  printf("Column major access time :%f s\n",               t / (float)CLOCKS_PER_SEC);  return 0;}
// Java program showing time difference// in row major and column major accessimport java.time.Duration;import java.time.Instant;import java.util.*; class GFG{ // taking MAX 10000 so that time difference// can be shownstatic int MAX= 10000; static int [][]arr = new int[MAX][MAX]; static void rowMajor(){     int i, j;         // accessing element row wise    for (i = 0; i < MAX; i++)    {        for (j = 0; j < MAX; j++)        {        arr[i][j]++;        }    }} static void colMajor(){     int i, j;         // accessing element column wise    for (i = 0; i < MAX; i++)    {        for (j = 0; j < MAX; j++)        {        arr[j][i]++;        }    }} // Driver codepublic static void main(String[] args){     // Time taken by row major order    Instant start = Instant.now();    rowMajor();    Instant end = Instant.now();        System.out.println("Row major access time : "+                    Duration.between(start, end));         // Time taken by column major order    start = Instant.now();    colMajor();    end = Instant.now();    System.out.printf("Column major access time : "+                    Duration.between(start, end));}} // This code is contributed by 29AjayKumar
# Python3 program showing time difference# in row major and column major access # taking MAX 10000 so that time difference# can be shownMAX = 1000from time import clock arr = [[ 0 for i in range(MAX)] for i in range(MAX)] def rowMajor():    global arr         # accessing element row wise    for i in range(MAX):        for j in range(MAX):            arr[i][j] += 1 def colMajor():    global arr     # accessing element column wise    for i in range(MAX):        for j in range(MAX):            arr[j][i] += 1 # Driver codeif __name__ == '__main__':     # Time taken by row major order    t = clock()    rowMajor();    t = clock() - t    print("Row major access time :{:.2f} s".format(t))     # Time taken by column major order    t = clock()    colMajor()    t = clock() - t    print("Column major access time :{:.2f} s".format(t)) # This code is contributed by mohit kumar 29
// C# program showing time difference// in row major and column major accessusing System;using  static System.DateTime;public class GFG{     // taking MAX 10000 so that time difference  // can be shown  public static int MAX = 1000;  public static int[,] arr = new int[GFG.MAX,GFG.MAX];  public static void rowMajor()  {    int i;    int j;    // accessing element row wise    for (      i = 0; i < GFG.MAX; i++)    {      for (        j = 0; j < GFG.MAX; j++)      {        GFG.arr[i,j]++;      }    }  }  public static void colMajor()  {    int i;    int j;    // accessing element column wise    for (      i = 0; i < GFG.MAX; i++)    {      for (        j = 0; j < GFG.MAX; j++)      {        GFG.arr[j,i]++;      }    }  }  // Driver code  public static void Main(String[] args)  {    // Time taken by row major order    var start = DateTime.UtcNow;    GFG.rowMajor();    var end = DateTime.UtcNow;    TimeSpan spanR = end.Subtract( start );    Console.WriteLine("Row major access time : " + spanR.TotalMinutes + " min");     // Time taken by column major order    start = DateTime.UtcNow;    GFG.colMajor();    end = DateTime.UtcNow;    TimeSpan spanC = end.Subtract( start );    Console.WriteLine("Column major access time : " + spanC.TotalMinutes + " min");  }} // This code is contributed by yoursthek2002
Row major access time :0.492000 s
Column major access time :1.621000 s
 
29AjayKumar
mohit kumar 29
yoursthek2002
Matrix
Matrix
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Sudoku | Backtracking-7
Divide and Conquer | Set 5 (Strassen's Matrix Multiplication)
Program to multiply two matrices
Count all possible paths from top left to bottom right of a mXn matrix
Printing all solutions in N-Queen Problem
Min Cost Path | DP-6
Python program to multiply two matrices
The Celebrity Problem
Multiplication of two Matrices in Single line using Numpy in Python
Gold Mine Problem