矩阵转置实现代码输出异常,求错误原因、正确算法及优化方案
矩阵转置代码问题排查与实现方案
现有代码的错误点
- 重复交换导致数据复原:双重循环遍历了所有
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
相关产品推荐
相关产品推荐

