public class MatrixDot {
public static void main(String[] args) {
// TODO Auto-generated method stub
double[][] matrix1 =
{{1},
{2},
{3}};
double[][] matrix2 =
{{1,2,3}};
double[][] matrix1_2 = dot(matrix1,matrix2);
double[][] matrix3 =
{{1,2,3},
{1,2,3}};
double[][] matrix4 =
{{1,2},
{1,2},
{1,2}};
double[][] matrix3_4 = dot(matrix3,matrix4);
System.out.println("----------matrix1 * matrix2 结果----------");
printMatrix(matrix1_2);
System.out.println("----------matrix3 * matrix4 结果----------");
printMatrix(matrix3_4);
}
public static double[][] dot(double[][] matrix1,double[][] matrix2){
if (matrix1[0].length != matrix2.length) {
System.out.println("矩阵格式不正确");
return null;
}
/*
* 1
* 1 2 3 * 2 = 14 (1*3 3*1 --> 1*1)
* 3
*
* 1 1
* 1 2 3 * 2 2 = 14 14 (1*3 3*2 --> 1*2)
* 3 3
*
* 1
* 1 2 3 * 2 = 14 (2*3 3*1 --> 2*1)
* 1 2 3 3 14
*
* 可以看出,矩阵乘法的结果的行和列是由第一个矩阵的行数和第二个矩阵的列数决定的
* 因此构建最终结果时二维数组的第一个长度(也就是矩阵的行数)应该等于第一个参数矩阵的行数
* 第二个长度(也就是矩阵的列数)应该等于第二个参数矩阵的列数
*/
double result[][] = new double[matrix1.length][matrix2[0].length];
/*
* 矩阵乘法流程是第一个矩阵的每一行与第二个矩阵的每一列中的数相乘并相加得到最终结果矩阵
* 那么就需要分三个循环来完成
* 第一个循环控制第一个矩阵的行数
* 第二个循环控制第二个矩阵的列数
* 第三个循环控制相乘后相加的次数
*/
for (int i = 0; i < matrix1.length; i++)//控制行数
for (int j = 0; j < matrix2[0].length; j++)//控制列数
for (int k = 0; k < matrix2.length; k++)//控制次数
result[i][j] += matrix1[i][k] * matrix2[k][j];
return result;
}
public static void printMatrix(double[][] matrix) {
for(int i=0;i<matrix.length;i++) {
for(int j=0;j<matrix[0].length;j++) {
System.out.print(matrix[i][j]+" ");
}
System.out.println();
}
}
}
计算结果如下: