Strassen矩阵乘法中add函数传入-1的作用是什么?
Strassen矩阵乘法中add函数传-1的作用及移除后结果出错的原因
传-1到底是干嘛的
在Strassen算法的实现里,很多开发者会复用同一个add函数同时实现矩阵加法和减法,-1就是用来切换运算逻辑的标记:
- 不传这个参数(或传入默认值1)时,函数执行标准矩阵加法:
C[i][j] = A[i][j] + B[i][j] - 传入
-1时,函数实际执行矩阵减法:C[i][j] = A[i][j] - B[i][j]
这种写法是为了避免重复编写几乎完全一致的加法、减法函数,通过一个系数参数来切换运算逻辑,你的add函数大概率是类似这样的:
vector<vector<int>> add(const vector<vector<int>>& A, const vector<vector<int>>& B, int sign = 1) { int n = A.size(); vector<vector<int>> res(n, vector<int>(n)); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { res[i][j] = A[i][j] + sign * B[i][j]; } } return res; }
这里sign默认值为1,对应加法;传入-1时,就变成A[i][j] + (-1)*B[i][j],等价于减法。
为啥移除这个参数结果就错了
Strassen算法的核心是通过7个中间矩阵(M1-M7)的计算推导最终结果,其中多个步骤必须用到矩阵减法,而非加法:
比如经典的Strassen计算步骤里:
- M3 = A11 * (B12 - B22) // 需要计算B12减B22
- M4 = A22 * (B21 - B11) // 需要计算B21减B11
- M6 = (A21 - A11) * (B11 + B12) // 需要计算A21减A11
- M7 = (A12 - A22) * (B21 + B22) // 需要计算A12减A22
如果移除-1这个参数,原本调用add(X, Y, -1)的减法步骤会被强制变成加法,导致M3、M4等中间矩阵的计算结果完全错误,最终推导出来的结果矩阵的四个子矩阵(C11、C12、C21、C22)也会全部偏离正确值,自然输出结果就错了。
说白了,-1是复用加法函数实现减法功能的关键,而减法是Strassen算法里的刚需步骤,去掉它等于直接破坏了算法的核心运算逻辑。
内容的提问来源于stack exchange,提问作者Dinesh
相关产品推荐
相关产品推荐

