矩阵相乘的基本原理
矩阵相乘是线性代数中的基本运算,其结果是一个新矩阵,其中每个元素是原矩阵对应行与列的点积,给定两个矩阵A(m×n)和B(n×p),它们的乘积C(m×p)中第i行第j列的元素C[i][j]计算公式为:

C[i][j] = Σ (A[i][k] * B[k][j]),其中k从0到n-1。
需要注意的是,矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,否则无法相乘,这一规则在Java实现中需要作为前置条件进行检查。
Java实现矩阵相乘的步骤
定义矩阵数据结构
在Java中,矩阵通常用二维数组表示,定义一个m×n的矩阵A:
int[][] A = new int[m][n]; int[][] B = new int[n][p]; int[][] C = new int[m][p]; // 结果矩阵
检查矩阵维度兼容性
在相乘前,需验证A的列数是否等于B的行数,若不兼容,应抛出异常或返回错误提示:

if (A[0].length != B.length) {
throw new IllegalArgumentException("矩阵维度不兼容:A的列数必须等于B的行数");
}
实现核心相乘逻辑
通过三层循环计算结果矩阵C:外层循环遍历C的行,中间层遍历列,内层计算点积,以下是具体代码:
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++) {
int sum = 0;
for (int k = 0; k < n; k++) {
sum += A[i][k] * B[k][j];
}
C[i][j] = sum;
}
}
优化与性能考虑
对于大规模矩阵,上述朴素算法的时间复杂度为O(m×n×p),可能效率较低,可通过以下方式优化:
- 并行计算:利用Java的
ForkJoinPool或并行流(parallelStream)将行计算任务分配到多个线程。 - 分块乘法:将矩阵分块计算,提高缓存命中率,尤其适用于大矩阵。
- 使用高效库:如Apache Commons Math或EJML,它们经过高度优化,适合生产环境。
示例代码与输出
以下是一个完整的Java示例,计算2×2矩阵与2×3矩阵的乘积:
public class MatrixMultiplication {
public static void main(String[] args) {
int[][] A = {{1, 2}, {3, 4}};
int[][] B = {{5, 6, 7}, {8, 9, 10}};
int m = A.length;
int n = A[0].length;
int p = B[0].length;
int[][] C = new int[m][p];
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++) {
int sum = 0;
for (int k = 0; k < n; k++) {
sum += A[i][k] * B[k][j];
}
C[i][j] = sum;
}
}
// 打印结果
for (int[] row : C) {
for (int num : row) {
System.out.print(num + " ");
}
System.out.println();
}
}
}
输出结果为:

21 24 27
52 57 62
常见问题与解决方案
- 维度不匹配:确保输入矩阵满足A的列数=B的行数,否则需提示用户修正输入。
- 空指针异常:检查矩阵是否为null或空数组,避免
NullPointerException。 - 数值溢出:若矩阵元素过大,可能导致整数溢出,可改用
long或BigDecimal类型。
通过以上方法,可以在Java中高效、准确地实现矩阵相乘运算,适用于科学计算、机器学习等多种场景。



















