为何C语言循环中矩阵元素会被对角线元素重复相乘?
3x3矩阵元素乘行对角线元素的异常问题修复
这段C代码意图实现:输入一个3x3矩阵,将每行的每个元素乘以该行的对角线元素,但运行后出现异常——当列索引大于行索引时,元素会被对角线元素乘两次。
原代码
#include <stdio.h> #define R 3 int a[R][R], i, j; int main(void) { for (i = 0; i < R; i++) { for (j = 0; j < R; j++) { printf("\nInsira o n%i%i ", i, j); scanf("%i", &a[i][j]); } } for (i = 0; i < R; i++) { for (j = 0; j < R; j++) { a[i][j] = a[i][j] * a[i][i]; } } for (i = 0; i < R; i++) { printf("\n"); for (j = 0; j < R; j++) { printf("%i ", a[i][j]); } } }
输入示例
9 8 7 6 5 4 3 2 1
异常输出结果
81 648 567 30 25 100 3 2 1
问题原因分析
问题出在第二个嵌套循环:处理第i行时,循环j从0到2,先修改了对角线元素a[i][i](将其变为原数的平方),之后处理j>i的元素时,使用的是已经被修改过的a[i][i](即原对角线值的平方)去乘,导致这些元素被原对角线值乘了两次。
举个例子:
- 第一行原对角线元素是9,j=0时,a[0][0]被修改为99=81;j=1时,用修改后的81去乘原a[0][1]=8,得到881=648,相当于899,也就是乘了两次9
- 第二行原对角线元素是5,j=2时,用修改后的25(55)去乘原a[1][2]=4,得到425=100,相当于455,同样乘了两次5
- 第三行没有j>i的情况,所以结果正常
修复方案
在处理每行之前,先把该行的对角线元素保存到临时变量中,再用这个临时变量去乘该行所有元素,避免修改原对角线元素后影响后续计算。修改后的代码如下:
#include <stdio.h> #define R 3 int a[R][R], i, j; int main(void) { for (i = 0; i < R; i++) { for (j = 0; j < R; j++) { printf("\nInsira o n%i%i ", i, j); scanf("%i", &a[i][j]); } } for (i = 0; i < R; i++) { // 提前保存当前行的对角线元素 int diag = a[i][i]; for (j = 0; j < R; j++) { a[i][j] = a[i][j] * diag; } } for (i = 0; i < R; i++) { printf("\n"); for (j = 0; j < R; j++) { printf("%i ", a[i][j]); } } }
修改后用同样输入,输出会变为符合预期的结果:
81 72 63 30 25 20 3 2 1
内容的提问来源于stack exchange,提问作者Saulo
相关产品推荐
相关产品推荐

