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从键盘读取用户输入。 - 用
rows和cols控制循环次数,实现通用性。 - 数组大小设为 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 语言实现矩阵转置?或者,如何让程序自动判断两个矩阵是否可以相加?
别忘了,每一次练习,都是你编程能力的积累。继续加油!