You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:55:19