用 C 语言计算矩阵的转置

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何用C语言计算矩阵的转置。本实验涵盖以下步骤:

读取维度和元素:你将学习如何读取矩阵的维度(行数和列数)并用用户输入的值填充它。此步骤为矩阵转置过程奠定基础。

交换行和列:矩阵转置的核心是交换原始矩阵的行和列以创建转置矩阵。

打印转置矩阵:最后,你将学习如何显示转置矩阵,以便验证转置过程的正确性。

完成本实验后,你将对矩阵转置有深入的理解,并能够在C编程中实现它。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/PointersandMemoryGroup(["Pointers and Memory"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/CompoundTypesGroup -.-> c/structures("Structures") c/PointersandMemoryGroup -.-> c/pointers("Pointers") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/for_loop -.-> lab-435166{{"用 C 语言计算矩阵的转置"}} c/arrays -.-> lab-435166{{"用 C 语言计算矩阵的转置"}} c/structures -.-> lab-435166{{"用 C 语言计算矩阵的转置"}} c/pointers -.-> lab-435166{{"用 C 语言计算矩阵的转置"}} c/user_input -.-> lab-435166{{"用 C 语言计算矩阵的转置"}} c/output -.-> lab-435166{{"用 C 语言计算矩阵的转置"}} end

读取维度和元素

在这一步中,你将学习如何在用于矩阵转置的C程序中读取矩阵的维度和元素。我们将创建一个程序,允许用户输入行数和列数,然后用值填充矩阵。

首先,为我们的矩阵转置程序创建一个新的C文件:

cd ~/project
nano matrix_transpose.c

现在,添加以下代码来读取矩阵的维度和元素:

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];

    // 读取矩阵维度
    printf("输入行数: ");
    scanf("%d", &rows);

    printf("输入列数: ");
    scanf("%d", &cols);

    // 输入矩阵元素
    printf("输入矩阵元素:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("输入元素 [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 打印原始矩阵
    printf("\n原始矩阵:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

编译并运行程序:

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

示例输出:

输入行数: 3
输入列数: 3
输入矩阵元素:
输入元素 [0][0]: 1
输入元素 [0][1]: 2
输入元素 [0][2]: 3
输入元素 [1][0]: 4
输入元素 [1][1]: 5
输入元素 [1][2]: 6
输入元素 [2][0]: 7
输入元素 [2][1]: 8
输入元素 [2][2]: 9

原始矩阵:
1 2 3
4 5 6
7 8 9

让我们来分析一下代码的关键部分:

  • 我们使用 MAX_ROWSMAX_COLS 定义了矩阵的最大尺寸
  • scanf() 用于读取用户输入的行数、列数和矩阵元素
  • 嵌套循环用于输入和显示矩阵元素
  • 程序在允许的最大矩阵尺寸内验证输入

交换行和列

在这一步中,你将学习如何通过交换矩阵的行和列来转置矩阵。我们将修改上一个程序来创建一个转置矩阵。

打开现有的 matrix_transpose.c 文件:

cd ~/project
nano matrix_transpose.c

用以下实现替换之前的代码:

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];
    int transposed[MAX_COLS][MAX_ROWS];

    // 读取矩阵维度
    printf("输入行数: ");
    scanf("%d", &rows);

    printf("输入列数: ");
    scanf("%d", &cols);

    // 输入矩阵元素
    printf("输入矩阵元素:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("输入元素 [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 转置矩阵
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }

    // 打印原始矩阵
    printf("\n原始矩阵:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // 打印转置矩阵
    printf("\n转置矩阵:\n");
    for (int i = 0; i < cols; i++) {
        for (int j = 0; j < rows; j++) {
            printf("%d ", transposed[i][j]);
        }
        printf("\n");
    }

    return 0;
}

编译并运行程序:

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

示例输出:

输入行数: 3
输入列数: 3
输入矩阵元素:
输入元素 [0][0]: 1
输入元素 [0][1]: 2
输入元素 [0][2]: 3
输入元素 [1][0]: 4
输入元素 [1][1]: 5
输入元素 [1][2]: 6
输入元素 [2][0]: 7
输入元素 [2][1]: 8
输入元素 [2][2]: 9

原始矩阵:
1 2 3
4 5 6
7 8 9

转置矩阵:
1 4 7
2 5 8
3 6 9

关于矩阵转置的要点:

  • 我们创建了一个维度交换后的新矩阵 transposed
  • 转置是通过交换行和列来完成的
  • transposed[j][i] = matrix[i][j] 是关键的转换操作
  • 原始矩阵和转置矩阵的维度是相反的

打印转置矩阵

在这最后一步中,你将学习如何格式化并打印转置矩阵,以提高可读性并增强错误处理能力。我们将改进上一个程序,使输出更加专业。

打开 matrix_transpose.c 文件:

cd ~/project
nano matrix_transpose.c

用以下改进后的实现替换之前的代码:

#include <stdio.h>

#define MAX_ROWS 100
#define MAX_COLS 100

void printMatrix(int matrix[MAX_ROWS][MAX_COLS], int rows, int cols, const char* title) {
    printf("%s:\n", title);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%4d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main() {
    int rows, cols;
    int matrix[MAX_ROWS][MAX_COLS];
    int transposed[MAX_COLS][MAX_ROWS];

    // 输入验证
    do {
        printf("输入行数 (1 - %d): ", MAX_ROWS);
        scanf("%d", &rows);
    } while (rows <= 0 || rows > MAX_ROWS);

    do {
        printf("输入列数 (1 - %d): ", MAX_COLS);
        scanf("%d", &cols);
    } while (cols <= 0 || cols > MAX_COLS);

    // 输入矩阵元素
    printf("输入矩阵元素:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("输入元素 [%d][%d]: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 转置矩阵
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            transposed[j][i] = matrix[i][j];
        }
    }

    // 以格式化输出打印矩阵
    printMatrix(matrix, rows, cols, "原始矩阵");
    printMatrix(transposed, cols, rows, "转置矩阵");

    return 0;
}

编译并运行程序:

gcc matrix_transpose.c -o matrix_transpose
./matrix_transpose

示例输出:

输入行数 (1 - 100): 3
输入列数 (1 - 100): 3
输入矩阵元素:
输入元素 [0][0]: 1
输入元素 [0][1]: 2
输入元素 [0][2]: 3
输入元素 [1][0]: 4
输入元素 [1][1]: 5
输入元素 [1][2]: 6
输入元素 [2][0]: 7
输入元素 [2][1]: 8
输入元素 [2][2]: 9

原始矩阵:
   1    2    3
   4    5    6
   7    8    9

转置矩阵:
   1    4    7
   2    5    8
   3    6    9

此版本的主要改进:

  • 增加了对矩阵维度的输入验证
  • 创建了一个单独的 printMatrix() 函数以提高代码组织性
  • 使用 %4d 改进矩阵打印格式,使其对齐
  • 为矩阵输出添加标题以提高清晰度
  • 更稳健地处理不同大小的矩阵

总结

在本实验中,你将学习如何在C程序中读取矩阵的维度和元素、交换行和列以及打印转置矩阵。首先,程序会提示用户输入行数和列数,然后允许用户输入矩阵元素。接着会显示原始矩阵。接下来,程序通过交换行和列来计算矩阵的转置,最后打印转置矩阵。

本实验的关键学习要点包括使用 scanf() 读取用户输入、实现嵌套循环来输入和显示矩阵元素,以及通过交换行和列来执行转置操作。该程序还展示了如何使用 printf() 来显示原始矩阵和转置矩阵。