проблема с присвоением переменных массивам с использованием структур в c - PullRequest
1 голос
/ 13 сентября 2010

Итак, я пытаюсь умножить матрицы в 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;
}

Ответы [ 4 ]

1 голос
/ 13 сентября 2010

Вам нужно 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
 {
  /* ... */
 }
}
0 голосов
/ 16 октября 2010

Похоже, что все ваши проблемы связаны с чтением значений матрицы в виде целых чисел, а не двойных. Все работает нормально, если вы измените temp в read_mat () на int, а затем приведите его к двойному значению, когда помещаете его в матрицу.

0 голосов
/ 13 сентября 2010

Это должно работать для вашего примера:

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;
}
0 голосов
/ 13 сентября 2010

Ваш код не содержит явных ошибок. Возможно, проблема заключается в вашем mat_new (). То, как вы определили mat в своей матричной структуре как double **mat;, что я бы не рекомендовал, может вызвать некоторые проблемы.

Чтобы выделить матрицу 2x2 мату, вам нужно сделать:

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

или матрица n by m:

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

Это то, что вы делаете?

...