[C] mnożenie macierzy

0

Witam serdecznie. Mam do napisania mnożenie macierzy przy pomocy wskaźników... i napisałem takie coś:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
 int i,j,k; 
  int m = 4;
  int n = 3;
  int r = 5;

 srand(time(NULL));

 int *mac1 = malloc(m*n*sizeof(int));
 int *mac2 = malloc(n*r*sizeof(int));
 int *macw = malloc(m*r*sizeof(int));

//-------------------------------- 
 for(i=0;i<m;i++)
  {
    for(j=0;j<n; j++)
    {
             *mac1=1+rand()%10;
    } 
  }

 printf ("Macierz 1:\n");
  for(i=0; i<m;i++)
  {
    for(j=0; j<n; j++)
    {
       printf("%3.d ", *mac1+i*n+j);
    }
    printf("\n");
  }
  printf("\n");
//----------------------------------  
  for(i=0;i<n;i++)
  {
    for(j=0;j<r; j++)
    {
             *mac2=1+rand()%10;
    } 
  }
  printf ("Macierz 2:\n");
  for(i=0; i<n;i++)
  {
    for(j=0; j<r; j++)
    {
       printf("%3.d ", *mac2+i*r+j);
    }
    printf("\n");
  }
  printf("\n");
//----------------------------------
 for(i=0; i<m; i++)
 {
    for(j=0; j<r; j++)
    {
             for(k=0; k<n; k++)
             {
                *(macw+i*r+j) += *(mac1+i*n+k)* *(mac2+k*r +j);
             }   
    }
 }

 for(i=0; i<m; i++)
  {
    for(j=0; j<r; j++)
    {
       printf("%5.d ", *(macw+i*r+j));
    }
    printf("\n");
  }

 free(mac1);
 free(mac2);
 free(macw);
  system("PAUSE");  
  return 0;
}

i od dobrych kilku godzin próbuję znaleźć błąd w wymnażaniu tych macierzy i nie mogę go znaleźć...
bardzo proszę o jakieś wskazówki co jest źle...

0

nie wiem czy dobrze myślę ale jak używasz funkcji malloc do przydzielania pamięci to chyba nie zeruje przydzielonego obszaru <mysli> a w programie nie widze nigdzie zerowania tablicy wynikowej... wiec moze tutaj jest błąd, że dodajesz wartości do czegoś czegoś gdzie moze byc jakaś wartość...

spróbuj zamienic:
int *macw = malloc(m*r*sizeof(int));
na:
int *macw = (int*)calloc(m*r, sizeof(int));

w ogole jakoś wolę podwójne wskaźniki... <mysli>

0

mnożenie macierzy wygląda tak:


macierze A*B=macierz C

               B=
           b11 b12 b13
           b21 b22 b23
           -----------
  a11 a12| c11 c12 c13
A=a21 a22| c21 c22 c23 =C
  a31 a32| c31 c32 c33

gdzie:

c11=a11*b11+a12*b21
c12=a11*b12+a12*b22
c13=a11*b13+a12*b23
c21=a21*b11+a22*b21
c22=a21*b12+a22*b22
c23=a21*b13+a22*b23
c31=a31*b11+a32*b21
c32=a31*b12+a32*b22
c33=a31*b13+a32*b23

To tyle, w czym mogę ci pomóc. Cały zaś program radzę ci oprzeć na tablicach (które są "naturalną" formą macierzy) i lepiej opisywać swój kod. Wiem że się nie chce pisać ale po znaczkach postaci a, b, c, d, i, j, k nie jestem w stanie nic wywnioskować. Warto moim zdaniem się nieco wysilić i napisać
int szerokosc_macierzy aby potem mieć absolutną pewność że nie złapiesz się pewnego dnia za głowę i nie krzykniesz "OMFG, co to jest?!"

0

tak jest, poprawka piograba: po mallacach daj:

/* line: 17 */ for(i=0;i<m*r;i++) macw[i]=0;

i do tego dochodzą poprawki wypełniania i wypisywania tablic:

/*line: 23 */  *(mac1+i*n+j)=1+rand()%10;
/*line: 32 */  printf("%3.d ", *(mac1+i*n+j) );
/*line: 42 */  *(mac2+i*r+j)=1+rand()%10;
/*line: 50 */  printf("%3.d ", *(mac2+i*r+j) );

samo mnożenie masz ok

0

Dziękuję Wam bardzo:) teraz działa:)

kiminoboku napisał(a)

Cały zaś program radzę ci oprzeć na tablicach (które są "naturalną" formą macierzy) i lepiej opisywać swój kod.

znaczy się mam napisane mnożenie tych macierzy na tablicach, ale mam takie polecenie zadania by napisać na wskaźnikach i na tablicach i porównać czas działania w przypadku dużych macierzy. I właśnie nie mogłem przebrnąć przez te wskaźniki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0