C中的矩阵乘法问题

时间:2016-07-22 09:49:48

标签: c matrix matrix-multiplication

我在C中制作矩阵乘法计算器。当我运行它时,会喷出许多数字并产生这样的结果:

57736 segmentation fault

我在哪里写错了?这是我写的代码:

int Mtx1row, Mtx1col, Mtx2row, Mtx2col, c, d, e;
int first[10][10], second[10][10], mult[10][10];

获取第一个矩阵行和列

  printf("First Matrix: # of row and col?\n");
  scanf("%d%d", &Mtx1row, &Mtx1col);

获取第二个矩阵行和列

  printf("Second Matrix: # of row and col?\n");
  scanf("%d%d", &Mtx2row, &Mtx2col);

比较第一个矩阵列和第二个矩阵行

  if (Mtx1col != Mtx2row){
    printf("Mtx1col != Mtx2row (x _ x)\n");
    return 1;
  }

获取第一个矩阵的元素

  printf("Enter elements of First Matrix: \n");
  for (c = 0; c < Mtx1row; c++)
  for (d = 0; d < Mtx1col; d++)
  {
    printf("\tEnter element %d%d: ", c+1, d+1);
    scanf("%d", &first[c][d]);
  }

获取第二个矩阵的元素

printf("Enter elements of Second Matrix: \n");
  for (c = 0; c < Mtx2row; c++)
  for (d = 0; d < Mtx2col; d++)
  {
    printf("\tEnter element %d%d: ", c+1, d+1);
    scanf("%d", &second[c][d]);
  }

将Matrix 1和2相乘并存储到Matrix Product

  for (c=0; c < Mtx2row; c++){
    for (d=0; d < Mtx2col; d++){
      for (e=0; e < Mtx1col; e++){
        mult[c][d] += first[c][d] * second[d][e];
      }
    }
  }

2 个答案:

答案 0 :(得分:0)

如果只有

,则两个矩阵可以相乘
In [134]:    
def func(x):
    return df['B'].shift(x['A'])[x.name]
df['C'] = df.apply(lambda x: func(x), axis=1)
df

Out[134]:
   A   B    C
0  1   6  NaN
1  2   7  NaN
2  1   8  7.0
3  2   9  7.0
4  1  10  9.0

所以你需要在创建2D数组之前检查一下。

#columns of the first matrix = #rows of the second matrix.

注意

  

在C11下,VLA是可选功能而非强制功能,   因为他们在C99下   变长数组中的术语变量并不意味着你可以   创建后修改数组的长度。一旦创建,一个   VLA保持相同的大小。术语变量的含义是你   在第一次指定数组维度时可以使用变量   创建数组。

以上摘录摘自 Stephen Prata的C ++ Primer Plus第6版

答案 1 :(得分:-1)

至少有一个数组变量multfirstsecond没有为发生的访问提供足够的内存。

Mtx2rowMtx2colMtx1col包含0到10之间的值时,内存访问应该没问题。所以请检查这些变量的值。作为第一步,您可以printf这些值,更好的是编程检查,以排除超出范围的值。另外,请检查矩阵是否具有矩阵乘法的兼容维度,即Mtx1col必须等于Mtx2row

编辑:

既然显示的代码包含scanf语句,我可以提供以下建议。 始终检查scanf的返回码以确保已解析所有参数。您甚至可以添加额外的%c以确保没有额外的输入。在您的情况下,您还必须检查读取数组索引是否在允许范围内(此处为0-9)。