C 语言实例 – 两个矩阵相加(完整指南)

C 语言实例 – 两个矩阵相加:从零开始掌握二维数组运算

在学习 C 语言的过程中,数组是一个绕不开的核心概念。而二维数组,就像一张表格,常用于存储和处理具有行与列结构的数据。比如图像像素、成绩单、地图坐标,甚至是游戏中的地图布局,都离不开二维数组的支持。

今天我们要讲解一个非常经典且实用的 C 语言实例:两个矩阵相加。这个操作在数学、工程计算、图像处理等领域频繁出现。掌握它,不仅能提升你对数组的理解,还能为后续学习线性代数、算法设计打下坚实基础。


什么是矩阵?为什么我们要相加?

想象你有两个班级的考试成绩表,每个班级有 3 个学生,每名学生有 4 门课程的成绩。这两个成绩表就可以看作两个 3×4 的矩阵(即 3 行 4 列)。

如果我们想计算两个班级在每门课程上的总成绩,就可以把这两个矩阵“对应位置相加”——这就是矩阵加法的本质。

矩阵加法规则:两个矩阵只有在行数和列数完全相同时,才能相加。结果矩阵的每个元素,等于两个输入矩阵对应位置元素之和。

这个规则听起来抽象?没关系,接下来我们一步步用 C 语言实现它。


创建数组与初始化

在 C 语言中,二维数组可以理解为“数组的数组”。我们先定义两个 3×3 的矩阵,用于演示。

#include <stdio.h>

int main() {
    // 定义两个 3x3 的矩阵,用 int 类型存储整数
    int matrix1[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    int matrix2[3][3] = {
        {9, 8, 7},
        {6, 5, 4},
        {3, 2, 1}
    };

    // 用于存放结果的矩阵
    int result[3][3];

    // 后续将在此处进行矩阵相加运算
    return 0;
}

📌 注释说明

  • int matrix1[3][3]:声明一个 3 行 3 列的整型二维数组。
  • {{1,2,3}, {4,5,6}, {7,8,9}}:初始化时用嵌套的大括号表示每行数据。
  • int result[3][3]:用于存储两个矩阵相加的结果,初始值为未定义,需手动赋值。

实现矩阵相加的核心逻辑

矩阵相加的关键是“对应位置相加”。我们可以通过双重循环来遍历所有行和列,把每个位置的元素相加。

// 开始进行矩阵相加
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        // 将 matrix1 和 matrix2 中第 i 行第 j 列的元素相加
        result[i][j] = matrix1[i][j] + matrix2[i][j];
    }
}

📌 注释说明

  • i 是行索引,从 0 到 2(共 3 行)。
  • j 是列索引,从 0 到 2(共 3 列)。
  • result[i][j] = matrix1[i][j] + matrix2[i][j];:把两个矩阵的对应元素相加,结果存入 result

💡 形象比喻
你可以把二维数组想象成一个棋盘。i 是横轴(行),j 是纵轴(列)。我们就像在棋盘上逐格巡视,每格都把两个矩阵的值加起来,再写到结果棋盘上。


打印结果矩阵

计算完成后,我们需要把结果展示出来。用同样的双重循环打印 result 数组即可。

// 打印结果矩阵
printf("两个矩阵相加的结果为:\n");
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        printf("%d ", result[i][j]);  // 输出每个元素,后跟空格
    }
    printf("\n");  // 每行结束后换行
}

📌 注释说明

  • printf("%d ", result[i][j]);:按整数格式输出元素,并加一个空格,方便对齐。
  • printf("\n");:每行打印完后换行,形成整齐的矩阵格式。

完整可运行代码示例

下面是完整的 C 语言程序,包含输入、计算、输出全过程。你可以直接复制到编译器中运行。

#include <stdio.h>

int main() {
    // 定义两个 3x3 的矩阵并初始化
    int matrix1[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    int matrix2[3][3] = {
        {9, 8, 7},
        {6, 5, 4},
        {3, 2, 1}
    };

    // 存放结果的矩阵
    int result[3][3];

    // 双重循环:遍历每行每列,执行对应位置相加
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            result[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }

    // 输出结果
    printf("矩阵1:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix1[i][j]);
        }
        printf("\n");
    }

    printf("矩阵2:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix2[i][j]);
        }
        printf("\n");
    }

    printf("两个矩阵相加的结果为:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}

📌 运行输出结果

矩阵1:
1 2 3 
4 5 6 
7 8 9 
矩阵2:
9 8 7 
6 5 4 
3 2 1 
两个矩阵相加的结果为:
10 10 10 
10 10 10 
10 10 10 

通用化:支持任意大小的矩阵

上面的例子固定为 3×3,但真实项目中矩阵大小可能是动态的。我们可以让用户输入矩阵的行数和列数。

#include <stdio.h>

int main() {
    int rows, cols;

    // 输入矩阵的行数和列数
    printf("请输入矩阵的行数:");
    scanf("%d", &rows);
    printf("请输入矩阵的列数:");
    scanf("%d", &cols);

    // 动态定义矩阵(在 C 中需注意栈大小,此处仅用于教学)
    int matrix1[100][100], matrix2[100][100], result[100][100];

    // 输入第一个矩阵
    printf("请输入第一个矩阵(%d x %d):\n", rows, cols);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            scanf("%d", &matrix1[i][j]);
        }
    }

    // 输入第二个矩阵
    printf("请输入第二个矩阵(%d x %d):\n", rows, cols);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            scanf("%d", &matrix2[i][j]);
        }
    }

    // 执行相加
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            result[i][j] = matrix1[i][j] + matrix2[i][j];
        }
    }

    // 输出结果
    printf("相加结果:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}

📌 关键点说明

  • 使用 scanf 从键盘读取用户输入。
  • rowscols 控制循环次数,实现通用性。
  • 数组大小设为 100×100,足够应对大多数初学者练习场景。

常见错误与调试建议

在实现 C 语言实例 – 两个矩阵相加时,初学者容易犯以下错误:

错误类型 原因 修正方法
数组越界 循环条件写成 i <= rows 应为 i < rows
矩阵维度不匹配 一个矩阵是 3×3,另一个是 2×2 确保输入时行列数一致
忘记初始化结果数组 导致输出垃圾值 手动赋值或在循环中填充
没有换行符 输出结果乱成一坨 每行末尾加 printf("\n");

建议:调试时先打印中间变量,比如 printf("i=%d, j=%d, val=%d\n", i, j, result[i][j]);,帮助定位问题。


总结与延伸思考

通过这个 C 语言实例 – 两个矩阵相加,我们不仅学会了二维数组的定义、初始化、遍历和赋值,更掌握了“逐位置运算”的核心思想。

这不仅是编程技巧,更是思维方式的训练:把复杂问题拆解为简单的重复操作

后续你可以尝试:

  • 实现矩阵相减、乘法
  • 用函数封装矩阵加法逻辑(提高代码复用性)
  • 加入输入验证(比如检查是否为数字)
  • 使用动态内存分配(malloc)处理大矩阵

这些进阶内容,都建立在今天这个基础之上。


写在最后

C 语言实例 – 两个矩阵相加,看似简单,实则蕴含了数组操作、循环控制、输入输出等多项核心技能。它像一块砖,搭起你通往更复杂编程世界的桥梁。

希望你能动手运行代码,修改数据,观察输出。编程不是看懂就等于掌握,而是写出来、跑起来、改出来

下一次,我们或许会聊聊:如何用 C 语言实现矩阵转置?或者,如何让程序自动判断两个矩阵是否可以相加?

别忘了,每一次练习,都是你编程能力的积累。继续加油!