【问题标题】:problem with variable assignment to arrays using structs in c使用c中的结构将变量分配给数组的问题
【发布时间】:2010-09-12 23:02:28
【问题描述】:

所以我试图在 c 中乘以矩阵。但是,当我尝试将两个数组中的数字相乘并将它们放入答案数组时,它始终为零。这是方法的代码,谢谢。

我的矩阵结构:

typedef struct matrix {
 int r;
 int c;
 double **mat;
 } *matrix_t;

我的矩阵乘法:

matrix_t mat_mult(matrix_t a, matrix_t b)
{
 int i, j, k;
 double x, temp1, temp2;
 double tempsol = 0.0;
 x = temp1 = temp2 = 0;
 matrix_t answer;

 if(a -> c == b -> r)
 {
    answer = mat_new(a -> r, b -> c);

    for(i = 0; i < a -> r; i++) 
       for( j = 0; j < b -> c; j++)
       {

           for( k = 0; k < a -> c; k++)
           {
               tempsol += a->mat[i][k] * b->mat[k][j];
               answer-> mat[i][j] =  tempsol;
           }

       }

 return answer;
 }
 else if(a -> r == b -> c)
 {
  answer = mat_new(a -> c, b -> r); 
  return answer;
 }
 else
 {
  printf("Matrices could not be multiplied");
  exit(1);
  return;
 }
}

这也是我的 mat_new 的代码

matrix_t mat_new(int r,int c)
{
int i = 0;
double **a;
matrix_t matrix_a;  

a = (double**)malloc(r *sizeof(double *));
for(i = 0; i < r; i++)
{
    a[i] = (double*)malloc(c *sizeof(double));
}
matrix_a = (matrix_t) malloc ( sizeof(struct matrix));
matrix_a -> mat = a;
matrix_a -> r = r;
matrix_a -> c = c;

return matrix_a;
}

【问题讨论】:

  • 代码块中的代码不正确。你应该编辑和更正那个。此外,只是好奇,您是否正确地为双 **mat 分配内存?
  • 是的,我相信内存分配正确,它可以存储值并打印它们,但由于某种原因,在这种方法中它不会让我将其他两个矩阵中的数字相乘并将其放入“答案”矩阵。如果我添加它们,它会起作用,但相乘什么都不做。
  • 我是这个网站的新手,你的意思是它在代码块中不正确。
  • Re: 以上:您可能会发现分配内存的线性数组比分配所有行指针 (r * sizeof(double*)) 然后分配每一列 (c * sizeof(double)) 更容易,这样可以节省你r 分配。然后,要获取数组的第i行、j列的元素,请访问mat[i * c + j],其中c是列数。
  • @jbernie2:Goutham 的意思是您发布它时它的格式可能不正确。如果你用四个空格缩进你的代码,它会得到语法高亮和适当的间距。我看到@wallyk 已经为你解决了。

标签: c struct multidimensional-array


【解决方案1】:

你需要free你的对象。您需要重置tempsol。但最重要的是,您需要查看您的mat_mult()

matrix_t mat_mult(matrix_t a, matrix_t b)
{
 /* ... */
 if(a -> c == b -> r)
 {
  /* ... */
 }
 else if(a -> r == b -> c)
 {
                                    /* BZZZZT!                 */
  answer = mat_new(a -> c, b -> r); /* BZZZZT! mat_mult(b, a); */
                                    /* BZZZZT!                 */
  return answer;
 }
 else
 {
  /* ... */
 }
}

【讨论】:

    【解决方案2】:

    似乎您的所有问题都源于将矩阵值读取为整数而不是双精度数。如果将 read_mat() 中的 temp 更改为 int,然后在将其放入矩阵时将其转换为 double,则一切正常。

    【讨论】:

      【解决方案3】:

      这应该适用于您的示例:

      matrix_t mat_new(int r,int c)
      {
        matrix_t new = malloc(sizeof*new);
        new->r   = r;
        new->c   = c;
        new->mat = malloc( r*c*sizeof(double) );
        return new;
      }
      

      【讨论】:

        【解决方案4】:

        您的代码不包含任何明显的错误。也许问题出在你的 mat_new() 上。您在矩阵结构中将 mat 定义为 double **mat; 的方式(我不推荐)可能会导致一些问题。

        要将 2x2 矩阵分配给 mat,您需要执行以下操作:

        mat = new (double*)[2];
        mat[0] = new double[2];
        mat[1] = new double[2];
        

        或一个 n × m 矩阵:

        mat = new (double*)[n];
        for (int i=0;i<n;i++) {
          mat[i] = new double[m];
        }
        

        这是你在做什么?

        【讨论】:

        • 这是我的mat_new方法,我不会用你用的方法,但如果你的方法更好,我显然会,无论如何,这是mat_new
        • 标题是“C”。您的解决方案是 C++。
        猜你喜欢
        • 2021-03-19
        • 1970-01-01
        • 2011-05-24
        • 2014-08-20
        • 1970-01-01
        • 2010-12-26
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        相关资源
        最近更新 更多