方阵可原地转置,非方阵必须新建容器;原地操作仅限上三角遍历(j从i+1开始),避免越界、覆盖与逻辑错乱;Python需深拷贝防引用陷阱。

二维数组的矩阵转置本质是行列互换:原矩阵第 i 行第 j 列的元素,变成新矩阵第 j 行第 i 列。是否原地操作,取决于矩阵形状和语言特性——方阵可以原地交换,非方阵必须新建容器。
什么时候能原地转置?
仅当矩阵为方阵(行数 == 列数)时,才可安全原地操作。这是因为内存按行优先连续存储,arr[i][j] 和 arr[j][i] 在地址上存在确定映射关系。非方阵强行原地交换会导致:
- 索引越界(如 2×3 矩阵中访问 arr[3][2] 会越出合法范围)
- 数据覆盖(交换过程中未被保护的元素被提前改写)
- 逻辑错乱(行列维度不匹配,无法一一对应)
方阵原地转置的正确写法
关键在遍历范围:只处理上三角区域(不含对角线),避免重复交换和自交换。以 C/C++ 或 Java 为例:
- 外层循环 i 从 0 到 n−1
- 内层循环 j 从 i+1 到 n−1
- 每次执行 swap(arr[i][j], arr[j][i])
Python 中同理,但要注意避免浅拷贝陷阱——不能用 copy() 或 [row for row in matrix],它们复制的是引用而非值。
非方阵必须用新数组
比如 3×4 矩阵转置后是 4×3,尺寸已变,无法塞回原空间。通用做法是:
- 申请新二维容器,行数 = 原列数,列数 = 原行数
- 双层循环:新矩阵 transposed[j][i] = original[i][j]
- C 语言中需显式声明大小,如 int transposed[COLS][ROWS]
- Python 可用列表推导:[[matrix[i][j] for i in range(len(matrix))] for j in range(len(matrix[0]))]
常见坑点提醒
很多错误源于对内存布局和对象引用的理解偏差:
- [[0]*n]*m 创建的是 m 个相同列表的引用,改一行全变
- 用 arr.copy() 复制二维列表,子列表仍共享内存
- 原地转置时 j 从 i 开始(而非 0),会导致对角线元素被 swap 两次归零
- C/C++ 中固定数组如 int a[3][3] 可原地操作;但 vector
> 需确保 size 一致且手动管理索引

















