c++中如何求矩阵的转置_c++二维数组矩阵转置代码

矩阵转置是将原矩阵的行变为列、列变为行,即Ai变为Aj;C++中静态二维数组因行优先存储且尺寸固定,非方阵必须新建数组实现,方阵原地转置也需避免重复交换。

什么是矩阵转置,C++里怎么理解

矩阵转置就是把原矩阵的行变成列、列变成行,A[i][j] 变成 A[j][i]。在 C++ 中,如果你用的是「静态二维数组」(比如 int a[3][4]),它的行列尺寸是编译期固定的,不能直接用通用函数交换维度——你得手动遍历并映射索引。

静态二维数组转置必须新建数组

因为原数组内存是连续按行存储的(row-major),int a[3][4] 占 12 个 int,而转置后是 4 行 × 3 列,形状不兼容,无法原地完成。强行“原地转置”只适用于方阵,且需复杂下标轮换,易出错,不推荐。

  • 非方阵(如 3×4)必须用新数组接收结果
  • 即使对方阵,std::swap(a[i][j], a[j][i]) 必须加 i 条件,否则会 swap 两次变回原样
  • 别试图用指针强制重解释内存布局——类型不匹配,int (*)[3]int (*)[4] 是不同类型,编译报错

最稳妥的转置写法(支持任意 M×N)

用两个嵌套循环,外层遍历原矩阵列数,内层遍历原矩阵行数。注意:目标数组声明时行列要互换。

const int M = 3, N = 4;
int src[M][N] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
int dst[N][M]; // 转置后是 N 行 × M 列

for (int i = 0; i < N; ++i) {
    for (int j = 0; j < M; ++j) {
        dst[i][j] = src[j][i];
    }
}
// 此时 dst[0][0] == 1, dst[0][1] == 5, dst[0][2] == 9 ...

如果用 vector> 怎么办

动态二维容器更灵活,但同样不能原地改 shape。你需要先 resize 目标容器的行数和每行长度,再赋值。

  • dst.resize(N) → 先设 N 行
  • 每行 dst[i].resize(M) → 每行 M 个元素
  • 仍用 dst[i][j] = src[j][i] 赋值,逻辑不变
  • 别漏掉初始化,否则访问未分配空间会崩溃

真正需要性能或复用时,建议封装成函数,参数含源矩阵引用、行列尺寸,并返回 vector> 或通过输出参数写入。

转置本身逻辑简单,陷阱全在类型匹配和内存布局上。尤其当从 Python 的 arr.T 切换过来时,容易忽略 C++ 数组维度不可变这一硬约束。