I am trying to implement a simple matrix multiplication in Java, where I am storing the matrices in two-dimensional ArrayLists. It would seem the error is caused by the setting of matrix Result
, inside the nested for loop, but I do not understand why.
import java.util.ArrayList; import java.util.Collections; import java.util.Arrays; public class Test { public static void main(String args[]) { int n = 2; ArrayList<ArrayList<Integer>> Result = new ArrayList<ArrayList<Integer>>( Collections.nCopies(n, new ArrayList<Integer>( Collections.nCopies(n, 0)))); ArrayList<ArrayList<Integer>> A = new ArrayList<ArrayList<Integer>>(); ArrayList<ArrayList<Integer>> B = new ArrayList<ArrayList<Integer>>(); A.add(new ArrayList<Integer>(Arrays.asList(1, 6))); A.add(new ArrayList<Integer>(Arrays.asList(2, 2))); B.add(new ArrayList<Integer>(Arrays.asList(0, 9))); B.add(new ArrayList<Integer>(Arrays.asList(5, 6))); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { int val = A.get(i).get(k) * B.get(k).get(j); Result.get(i).set(j, Result.get(i).get(j) + val); } } } } }
The code produces the result:
A * B = [[40, 75], [40, 75]]
when in fact it should be:
A * B = [[30, 45], [10, 30]]
Advertisement
Answer
The Result
is incorrectly initialized.
ArrayList<ArrayList<Integer>> Result = new ArrayList<ArrayList<Integer>>( Collections.nCopies(n, new ArrayList<Integer>(Collections.nCopies(n, 0))));
This creates a matrix where two rows (or columns, depending how you look at that) are in fact same row (column), referenced twice.
You can init Result
like that:
List<List<Integer>> result = new ArrayList<>(); for (int i = 0; i < n; i++) { result.add(new ArrayList<>(Collections.nCopies(n, 0))); }