Matrix Addition in Java


The challenge

Write a function that accepts two square matrices (N x N two dimensional arrays), and return the sum of the two. Both matrices being passed into the function will be of size N x N (square), containing only integers.

How to sum two matrices:

Take each cell [n][m] from the first matrix, and add it with the same [n][m] cell from the second matrix. This will be cell [n][m] of the solution matrix.

Visualization:

|1 2 3|     |2 2 1|     |1+2 2+2 3+1|     |3 4 4|
|3 2 1|  +  |3 2 3|  =  |3+3 2+2 1+3|  =  |6 4 4|
|1 1 1|     |1 1 3|     |1+1 1+1 1+3|     |2 2 4|

Example

matrixAddition(
  [ [1, 2, 3],
    [3, 2, 1],
    [1, 1, 1] ],
//      +
  [ [2, 2, 1],
    [3, 2, 3],
    [1, 1, 3] ] )

// returns:
  [ [3, 4, 4],
    [6, 4, 4],
    [2, 2, 4] ]

The solution in Java code

Option 1:

public class Solution {
  public static int[][] matrixAddition(int[][] a, int[][] b) {
    int matLen = a.length;
    int[][] resultMatrix = new int[matLen][matLen];
    for(int i = 0; i < matLen; i++) {
      for(int j = 0; j < matLen; j++) {
        resultMatrix[i][j] = a[i][j] + b[i][j];
      }
    }
    return resultMatrix;
  }
}

Option 2:

import java.util.stream.IntStream;
public class Solution {
  public static int[][] matrixAddition(int[][] a, int[][] b) {
    IntStream.range(0, a.length * a.length)
                 .forEach(n -> a[n / a.length][n % a.length] += b[n / a.length][n % a.length]);
        return a;
  }
}

Option 3:

public class Solution {
  public static int[][] matrixAddition(int[][] a, int[][] b) {
    for(int row=0;row<a.length;row++)
    for(int col=0;col<a[0].length;col++)
      a[row][col]+=b[row][col];
      
    return a;
  }
}

Test cases to validate our solution

import org.junit.Test;
import static org.junit.Assert.assertArrayEquals;

public class MatrixAdditionTest {
	
	@Test
	public void sampleTest() {
		int[][] expected = new int[][] { { 3, 4, 4 }, { 6, 4, 4 }, { 2, 2, 4 } };
		
		assertArrayEquals(expected,
				Solution.matrixAddition(
						new int[][] { { 1, 2, 3 }, { 3, 2, 1 }, { 1, 1, 1 } },
						new int[][] { { 2, 2, 1 }, { 3, 2, 3 }, { 1, 1, 3 } }));
		
		expected = new int[][] { { 3 } };
		assertArrayEquals(expected, 
				Solution.matrixAddition(
						new int[][] { { 1 } },
						new int[][] { { 2 } }));
		
		expected = new int[][] { { 3, 5 }, { 3, 5 } };
		assertArrayEquals(expected,
				Solution.matrixAddition(
						new int[][] { { 1, 2 }, { 1, 2 } },
						new int[][] { { 2, 3 }, { 2, 3 } }));
	}
}