Java 二维数组矩阵乘法实战解析:矩阵相乘的实现
一、原题完整代码呈现
以下是计算机二级Java考试中关于二维数组操作的典型题型,主要考察矩阵乘法的实现逻辑、二维数组的初始化和嵌套循环的应用,包含4处需要填写的空白(标记为//*********Found**********
):
public class Java_2 {
public static void main(String args[]) {
int [][]a = {{2, 3, 4}, {4, 6, 5}};
int [][]b = {{1, 5, 2, 8}, {5, 9, 10, -3}, {2, 7, -5, -18}};
//*********Found**********
int [][]c = ______________;
for (int i = 0; i < 2; i++) {
//*********Found**********
for (int j = 0; j < _______; j++) {
//*********Found**********
__________________;
for (int k = 0; k < 3; k++)
//*********Found**********
c[i][j] += __________________;
System.out.print(c[i][j] + " ");
}
System.out.println();
}
}
}
二、空白处逐一解析与解答
1. 第一处空白:初始化结果矩阵
答案:new int[2][4]
//*********Found**********
int [][]c = new int[2][4];
解析:
矩阵乘法中,若矩阵a
是m×n
维,矩阵b
是n×p
维,则结果矩阵c
是m×p
维。本题中:
a
是2×3
维(2行3列)b
是3×4
维(3行4列)
因此结果矩阵c
应为2×4
维(2行4列),需初始化一个2行4列的二维数组,填写new int[2][4]
。
2. 第二处空白:控制列循环范围
答案:4
或 b[0].length
//*********Found**********
for (int j = 0; j < 4; j++) {
解析:
内层循环用于遍历结果矩阵c
的列索引j
。由于c
是2×4
维,列索引范围是0~3
,因此循环条件应为j < 4
。也可通过b[0].length
动态获取(b
的列数为4),两种写法均正确。
3. 第三处空白:初始化元素值
答案:c[i][j] = 0
//*********Found**********
c[i][j] = 0;
解析:
计算矩阵元素c[i][j]
时,需要先将其初始化为0,再累加a[i][k]×b[k][j]
的结果(k
从0到2)。若不初始化,数组元素会默认取0(int类型默认值),但显式初始化更符合逻辑,确保计算准确性,填写c[i][j] = 0
。
4. 第四处空白:累加乘积结果
答案:a[i][k] * b[k][j]
//*********Found**********
c[i][j] += a[i][k] * b[k][j];
解析:
矩阵乘法的核心公式是c[i][j] = Σ(a[i][k] × b[k][j])
(k
从0到n-1
,n
是a
的列数/b
的行数)。此处通过循环累加每个a[i][k]
与b[k][j]
的乘积,因此填写a[i][k] * b[k][j]
。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序实现两个矩阵的乘法运算,核心功能包括:
- 定义两个二维数组
a
(2×3)和b
(3×4)作为输入矩阵 - 创建结果矩阵
c
(2×4)存储运算结果 - 通过三重嵌套循环计算矩阵乘积:
c[i][j] = a[i][0]×b[0][j] + a[i][1]×b[1][j] + a[i][2]×b[2][j]
- 打印结果矩阵
c
的所有元素
运行说明
输入矩阵定义:
a = [[2, 3, 4], [4, 6, 5]]
(2行3列)b = [[1, 5, 2, 8], [5, 9, 10, -3], [2, 7, -5, -18]]
(3行4列)
计算过程(以
c[0][0]
为例):c[0][0] = a[0][0]×b[0][0] + a[0][1]×b[1][0] + a[0][2]×b[2][0] = 2×1 + 3×5 + 4×2 = 2 + 15 + 8 = 25
完整结果矩阵
c
:25 56 22 -65 44 107 57 -85
五、核心知识点总结
二维数组的定义与初始化
- 静态初始化:
int[][] a = {{2,3,4}, {4,6,5}}
直接指定每行元素 - 动态初始化:
int[][] c = new int[2][4]
指定行数和列数,元素默认值为0 - 维度获取:
a.length
获取行数(2),a[0].length
获取第一行的列数(3)
- 静态初始化:
矩阵乘法的数学原理
- 维度要求:左矩阵的列数必须等于右矩阵的行数(
a
的列数3 =b
的行数3) - 结果维度:行数=左矩阵行数(2),列数=右矩阵列数(4)
- 元素计算:
c[i][j]
是a
的第i
行与b
的第j
列对应元素乘积的和
- 维度要求:左矩阵的列数必须等于右矩阵的行数(
三重嵌套循环的应用
- 外层循环(
i
):遍历结果矩阵的行(0~1) - 中层循环(
j
):遍历结果矩阵的列(0~3) - 内层循环(
k
):计算单行单列的累加和(0~2,对应a
的列和b
的行) - 执行顺序:先固定
i
和j
,通过k
循环计算c[i][j]
,再移动j
,最后移动i
- 外层循环(
累加算法的实现
- 初始化:计算前将
c[i][j]
设为0,确保累加起点正确 - 累加操作:
c[i][j] += a[i][k] * b[k][j]
等价于c[i][j] = c[i][j] + a[i][k] * b[k][j]
- 结果输出:内层循环结束后打印
c[i][j]
,行结束后换行
- 初始化:计算前将
六、常见错误与应试技巧
常见错误分析
- 结果矩阵维度错误:初始化
c
为new int[3][2]
或new int[2][3]
,违背矩阵乘法维度规则 - 循环范围错误:中层循环条件写成
j < 3
(使用a
的列数),导致只计算3列(正确应为4列) - 遗漏初始化:未执行
c[i][j] = 0
,虽然int默认值为0,但在修改代码时可能引发逻辑错误 - 乘积顺序错误:写成
b[i][k] * a[k][j]
,混淆矩阵乘法的左右顺序(矩阵乘法不满足交换律)
- 结果矩阵维度错误:初始化
应试技巧
- 维度记忆公式:"若A是m×n,B是n×p,则C是m×p"
- 循环范围口诀:"i控行(m),j控列(p),k循环n次"
- 累加模板:"先清零,再累加,乘积顺序别搞反"
- 动态获取维度:推荐使用
a.length
、b[0].length
代替硬编码数字,增强代码灵活性
通过本题,我们掌握了二维数组的初始化、矩阵乘法的实现逻辑以及三重嵌套循环的应用。矩阵乘法是线性代数的基础运算,在图形学、机器学习等领域有广泛应用。理解这种"三重循环+累加"的模式,对处理多维数据和复杂计算问题具有重要意义,也是Java中数组操作的进阶知识点。