C语言实现数组转置的代码详解

数组转置是指将矩阵的行列互换,即将原矩阵的第i行第j列元素变为新矩阵的第j行第i列元素。下面我将详细讲解如何在C语言中实现数组转置。

图片[1]_C语言实现数组转置的代码详解_知途无界

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;
}

代码解析:

  1. transpose函数:
  • 外层循环i从0到N-1,遍历每一行
  • 内层循环j从i+1开始,避免重复交换(对角线元素不需要交换)
  • 使用临时变量temp交换matrix[i][j]matrix[j][i]
  1. printMatrix函数:
  • 双重循环打印矩阵
  1. 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;
}

代码解析:

  1. transpose函数:
  • 为结果矩阵动态分配内存(cols x rows)
  • 双重循环将原矩阵元素matrix[i][j]赋给result[j][i]
  1. printMatrix函数:
  • 根据行数和列数打印矩阵
  1. freeMatrix函数:
  • 释放动态分配的矩阵内存
  1. 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;
}

代码解析:

  1. 使用一维数组存储矩阵数据,通过i * cols + j计算元素位置
  2. 转置时,将matrix[i][j](即matrix[i * cols + j])赋给result[j][i](即result[j * rows + i]
  3. 这种方法减少了内存分配次数,适合处理大型矩阵

总结

  1. 方阵转置可以直接在原数组上进行元素交换,只需遍历矩阵的上三角或下三角区域。
  2. 非方阵转置需要创建新的数组存储结果,行列数互换。
  3. 动态内存分配适用于运行时才知道矩阵大小的情况,注意要释放内存。
  4. 一维数组可以提高内存访问效率,适合处理大型矩阵。

根据实际需求选择合适的实现方式,方阵转置效率最高,非方阵转置需要额外空间,一维数组实现适合性能敏感场景。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞24 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容