二维数组做函数参数与矩阵的相乘
二维数组做函数参数与矩阵的相乘
背景:
1 | |
代码实现:
1 | |
矩阵的相乘:
假设:
$$A = \begin{bmatrix} \mathbf{1} & \mathbf{2} & \mathbf{3} \ 4 & 5 & 6 \end{bmatrix} \quad B = \begin{bmatrix} \mathbf{7} & 8 \ \mathbf{9} & 1 \ \mathbf{10} & 2 \end{bmatrix}$$
我们想算结果矩阵 左上角 的数:
- 取出 A 的第一行:
[1, 2, 3] - 取出 B 的第一列:
[7, 9, 10](注意是竖着的) - 计算动作:
- $1$ 碰到了 $7 \rightarrow 1 \times 7 = 7$
- $2$ 碰到了 $9 \rightarrow 2 \times 9 = 18$
- $3$ 碰到了 $10 \rightarrow 3 \times 10 = 30$
- 求和:$7 + 18 + 30 = \mathbf{55}$
所以,结果矩阵的左上角就是 55。
怎么填满整个结果矩阵?
你就按照顺序重复上面的动作:
A的第一行 $\times$ B的第一列 $\rightarrow$ 填在结果的 (0,0)
A的第一行 $\times$ B的第二列 $\rightarrow$ 填在结果的 (0,1)
(A的第一行用完了,换下一行)
A的第二行 $\times$ B的第一列 $\rightarrow$ 填在结果的 (1,0)
A的第二行 $\times$ B的第二列 $\rightarrow$ 填在结果的 (1,1)
我的代码:
1 | |
需要在二维数组的循环基础上再套一个循环(如上定义变量k)
外层两个循环的 i ,j 为**c[i] [j]**服务,
内层循环计算c[i] [j]的值
第一次先计算c[0] [0]
c[0] [0] = a[0] [0] * b[0] [0]
+a[0] [1] * b[1] [0]
+a[0] [2] * b[2] [0]
+a[0] [3] * b[3] [0]
a的列在变化,小于a的列(N)
b的行在变化,小于b的行(N)
==总结==:c[i] [j] 指的是用a的第i行中的每一个数 乘 b的第j列中对应的数 再全部加起来
二维数组做参数的注意事项:
在函数声明中,可以省略第一维(行数),但绝对不能省略第二维(列数)。
语法:
void func(int arr[][N], int rows)为什么:C语言中的二维数组在内存中是连续线性存储的(按行优先)。为了找到 arr[i][j],编译器在后台执行的计算公式是:
$$Address = Base + (i \times \text{列数} + j) \times \text{数据大小}$$
如果编译器不知道“列数”,它就无法算出下一行从哪里开始。