矩阵转置是将原矩阵的行变为列、列变为行,即Ai变为Aj;C++中静态二维数组因行优先存储且尺寸固定,非方阵必须新建数组实现,方阵原地转置也需避免重复交换。
矩阵转置就是把原矩阵的行变成列、列变成行,A[i][j] 变成 A[j][i]。在 C++ 中,如果你用的是「静态二维数组」(比如 int a[3][4]),它的行列尺寸是编译期固定的,不能直接用通用函数交换维度——你得手动遍历并映
射索引。
因为原数组内存是连续按行存储的(row-major),int a[3][4] 占 12 个 int,而转置后是 4 行 × 3 列,形状不兼容,无法原地完成。强行“原地转置”只适用于方阵,且需复杂下标轮换,易出错,不推荐。
std::swap(a[i][j], a[j][i]) 必须加 i 条件,否则会 swap 两次变回原样
int (*)[3] 和 int (*)[4] 是不同类型,编译报错用两个嵌套循环,外层遍历原矩阵列数,内层遍历原矩阵行数。注意:目标数组声明时行列要互换。
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 ...
动态二维容器更灵活,但同样不能原地改 shape。你需要先 resize 目标容器的行数和每行长度,再赋值。
dst.resize(N) → 先设 N 行dst[i].resize(M) → 每行 M 个元素dst[i][j] = src[j][i] 赋值,逻辑不变真正需要性能或复用时,建议封装成函数,参数含源矩阵引用、行列尺寸,并返回 vector 或通过输出参数写入。
arr.T 切换过来时,容易忽略 C++ 数组维度不可变这一硬约束。