矩阵转置是将原矩阵的行变为列、列变为行,即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 目标容器的行数和每行长度,再赋值。
立即学习“C++免费学习笔记(深入)”;
-
dst.resize(N)→ 先设 N 行 - 每行
dst[i].resize(M)→ 每行 M 个元素 - 仍用
dst[i][j] = src[j][i]赋值,逻辑不变 - 别漏掉初始化,否则访问未分配空间会崩溃
真正需要性能或复用时,建议封装成函数,参数含源矩阵引用、行列尺寸,并返回 vector 或通过输出参数写入。
arr.T 切换过来时,容易忽略 C++ 数组维度不可变这一硬约束。











