数组转置是指将矩阵的行列互换,即将原矩阵的第i行第j列元素变为新矩阵的第j行第i列元素。下面我将详细讲解如何在C语言中实现数组转置。
![图片[1]_C语言实现数组转置的代码详解_知途无界](https://zhituwujie.com/wp-content/uploads/2025/05/d2b5ca33bd20250510103958.png)
1. 方阵转置(行数=列数)
对于方阵(行数和列数相同的矩阵),转置可以直接在原数组上进行操作。
#include <stdio.h>
#define N 3 // 定义矩阵的维度
void transpose(int matrix[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
// 交换matrix[i][j]和matrix[j][i]
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
void printMatrix(int matrix[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
int main() {
int matrix[N][N] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
printf("原矩阵:\n");
printMatrix(matrix);
transpose(matrix);
printf("\n转置后的矩阵:\n");
printMatrix(matrix);
return 0;
}
代码解析:
transpose函数:
- 外层循环
i从0到N-1,遍历每一行 - 内层循环
j从i+1开始,避免重复交换(对角线元素不需要交换) - 使用临时变量
temp交换matrix[i][j]和matrix[j][i]
printMatrix函数:
- 双重循环打印矩阵
main函数:
- 初始化一个3×3矩阵
- 打印原矩阵
- 调用转置函数
- 打印转置后的矩阵
2. 一般矩阵转置(行数≠列数)
对于非方阵,转置需要创建一个新的数组来存储结果。
#include <stdio.h>
#include <stdlib.h>
void transpose(int **matrix, int rows, int cols, int ***result) {
// 为结果矩阵分配内存
*result = (int **)malloc(cols * sizeof(int *));
for (int i = 0; i < cols; i++) {
(*result)[i] = (int *)malloc(rows * sizeof(int));
}
// 执行转置
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
(*result)[j][i] = matrix[i][j];
}
}
}
void printMatrix(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
void freeMatrix(int **matrix, int rows) {
for (int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
}
int main() {
int rows = 2, cols = 3;
// 动态分配内存并初始化矩阵
int **matrix = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
matrix[i] = (int *)malloc(cols * sizeof(int));
}
// 填充矩阵数据
int count = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = count++;
}
}
printf("原矩阵(%dx%d):\n", rows, cols);
printMatrix(matrix, rows, cols);
int **result = NULL;
transpose(matrix, rows, cols, &result);
printf("\n转置后的矩阵(%dx%d):\n", cols, rows);
printMatrix(result, cols, rows);
// 释放内存
freeMatrix(matrix, rows);
freeMatrix(result, cols);
return 0;
}
代码解析:
transpose函数:
- 为结果矩阵动态分配内存(cols x rows)
- 双重循环将原矩阵元素
matrix[i][j]赋给result[j][i]
printMatrix函数:
- 根据行数和列数打印矩阵
freeMatrix函数:
- 释放动态分配的矩阵内存
main函数:
- 动态创建2×3矩阵并初始化
- 打印原矩阵
- 调用转置函数
- 打印转置后的3×2矩阵
- 释放所有分配的内存
3. 使用一维数组模拟矩阵转置
对于大型矩阵,可以使用一维数组来存储矩阵数据以提高性能。
#include <stdio.h>
void transpose(int *matrix, int rows, int cols, int *result) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
result[j * rows + i] = matrix[i * cols + j];
}
}
}
void printMatrix(int *matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", matrix[i * cols + j]);
}
printf("\n");
}
}
int main() {
int rows = 2, cols = 3;
int matrix[6] = {1, 2, 3, 4, 5, 6}; // 2x3矩阵
int result[6]; // 转置后为3x2矩阵
printf("原矩阵(%dx%d):\n", rows, cols);
printMatrix(matrix, rows, cols);
transpose(matrix, rows, cols, result);
printf("\n转置后的矩阵(%dx%d):\n", cols, rows);
printMatrix(result, cols, rows);
return 0;
}
代码解析:
- 使用一维数组存储矩阵数据,通过
i * cols + j计算元素位置 - 转置时,将
matrix[i][j](即matrix[i * cols + j])赋给result[j][i](即result[j * rows + i]) - 这种方法减少了内存分配次数,适合处理大型矩阵
总结
- 方阵转置可以直接在原数组上进行元素交换,只需遍历矩阵的上三角或下三角区域。
- 非方阵转置需要创建新的数组存储结果,行列数互换。
- 动态内存分配适用于运行时才知道矩阵大小的情况,注意要释放内存。
- 一维数组可以提高内存访问效率,适合处理大型矩阵。
根据实际需求选择合适的实现方式,方阵转置效率最高,非方阵转置需要额外空间,一维数组实现适合性能敏感场景。
© 版权声明
文中内容均来源于公开资料,受限于信息的时效性和复杂性,可能存在误差或遗漏。我们已尽力确保内容的准确性,但对于因信息变更或错误导致的任何后果,本站不承担任何责任。如需引用本文内容,请注明出处并尊重原作者的版权。
THE END

























暂无评论内容