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

矩阵转置实现代码输出异常,求错误原因、正确算法及优化方案

矩阵转置代码问题排查与实现方案

现有代码的错误点

  • 重复交换导致数据复原:双重循环遍历了所有i<m, j<n的元素,每一对(i,j)和(j,i)会被交换两次,最终回到初始值,相当于转置操作没有生效。
  • 仅支持方阵、存在越界风险:如果原矩阵不是方阵(m≠n),访问a[j][i]时会出现数组下标越界,非方阵的行列数在转置后会发生变化,不可能在原数组空间内完成原地转置。
  • 输出维度错误:转置后的矩阵是n行m列,现有代码仍按原矩阵的m行n列输出,结果自然不符合预期。

正确实现

1. 通用非原地转置(支持所有行列的矩阵)

开辟新数组存储转置结果,兼容性最高:

// 原矩阵a为m行n列,转置矩阵res为n行m列
int res[n][m];
for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
        res[j][i] = a[i][j];
    }
}
// 输出转置结果
cout << "Elements of transpose matrix of a is: " << endl;
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        cout << res[i][j] << " ";
    }
    cout << endl;
}

2. 方阵原地转置(仅支持m=n的方阵)

无需额外开辟数组空间,仅需要调整内层循环范围避免重复交换:

// 仅适用于m=n的方阵
for (int i = 0; i < m; i++) {
    // 内层循环从i+1开始,每对元素仅交换一次
    for (int j = i + 1; j < m; j++) {
        int temp = a[i][j];
        a[i][j] = a[j][i];
        a[j][i] = temp;
    }
}
// 方阵转置后行列数不变,直接按m行m列输出即可
cout << "Elements of transpose matrix of a is: " << endl;
for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) {
        cout << a[i][j] << " ";
    }
    cout << endl;
}

优化方法

  • 缓存友好优化:处理大矩阵时,常规转置的跳步写入会频繁触发缓存失效,可以采用分块转置方案,将矩阵切割为32x32或64x64的小块逐块转置,让数据尽可能留在CPU缓存中,能大幅提升大矩阵的转置效率。
  • 空间优化:方阵场景优先选择原地转置,空间复杂度从O(mn)降到O(1),无需额外内存开销。
  • 稀疏矩阵优化:如果矩阵绝大多数元素为0,可采用三元组、CSR等稀疏存储格式,转置时仅需要交换非零元素的行列下标后重新排序,时间和空间开销远低于普通转置方案。

内容的提问来源于stack exchange,提问作者Ashish Kushwaha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:57:02