We develop a static method, `matrixProduct`, that takes as parameters
two matrices `A` and `B` of doubles and returns a new matrix
obtained as the product of `A` and `B`. Assume that the matrices
are square, i.e., they have the same numbers of rows and columns, and that
`A` and `B` have the same dimensions.

Recall that, if `C` is the product of `A` and `B`, then
the generic element `C[i][j]` is the scalar product row `i` of
`A` with column `j` of `B`, i.e.,
`C[i][j] = (A[i][k]*B[k][j])`.

public static double[][] matrixProduct(double[][] A, double[][] B) { double[][] C = new double [A.length][A[0].length]; for (int i = 0; i < A.length; i++) for (int j = 0; j < A[0].length; j++) { C[i][j] = 0; for (int k = 0; k < A[0].length; k++) C[i][j] += A[i][k] * B[k][j]; } return C; }

Note that, in order to calculate the product of the matrices `A` and
`B`, we use three nested `for` loops: the outermost loop iterates
over the rows (`i`) of `C`, the intermediate loop iterates over
the columns (`j`) of `C`, while the innermost loop calculates the
scalar product of row `i` of `A` with column `j` of
`B`, and assigns the calculated value to `C[i][j]`.

*Example of usage:*

public static void main(String[] args) { double[][] A = { // creates matrix A of dimension 3x3 { 1.0, 2.0, 2.0 }, { 7.0, 5.0, 9.0 }, { 3.0, 0.0, 6.0 } }; double[][] B = { // creates matrix B of dimension 3x3 { 5.0, 4.0, 1.0 }, { 1.0, 0.0, 3.0 }, { 7.0, 5.0, 2.0 } }; double[][] C = matrixProduct(A,B); // calculates the product A*B System.out.println(C[1][0]); // prints 103.0 (obtained as // 7.0*5.0 + 5.0*1.0 + 9.0*7.0) }