Iloczyn macierzy

Mar_ko
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 6 lip 2010, o 13:09
Płeć: Mężczyzna
Lokalizacja: POLSKA
Podziękował: 2 razy

Iloczyn macierzy

Post autor: Mar_ko »

Witem czy może ktoś sprawdzić mój kod i powiedzieć gdzie jest błąd.
program nie chce mi mnożyć macierzy i nie wiem czy namieszałem coś w pętlach czy wszystko mam źle?

Kod: Zaznacz cały

#include<stdio.h>
int main()
{
int i,j,b,a,c;
int **macierz;
printf("                          Pierwsza macierz (A)

");
    printf(">>>>>>>>>>>>>>>>>>>>>>>>>>> Podaj jej wymiary <<<<<<<<<<<<<<<<<<<<<<<<<<<<

");
    printf("Podaj liczbe kolumn
");
    scanf("%i", &a);
    printf("Podaj liczbe wierszy
");
    scanf("%i", &b);
    printf("Podaj %d wartosci 

", a*b);
    macierz=(int**)malloc(sizeof(int*)*b); /*Dynamiczne wprowadzanie macierzy*/
    for(i=0;i<b;i++) 
    macierz[i]=(int*)malloc(sizeof(int)*a);
    for(i=0;i<b;i++)
    for(j=0;j<a;j++)
    {                
          printf("Podaj liczbe ");
          scanf("%d", &macierz[i][j]);
          }
          printf("                          Pierwsza macierz (A):
");
           /* wypisuje tablice */
           for(i = 0 ; i < b ; i++)
           {
                 for(j = 0 ; j < a ; j++)
                 {
                 printf("%d ", macierz[i][j]) ;
                 }
                 printf("
") ; /* oddziela każdy nowy wiersz */
    }
    int x,y,q,w;
    int **macierz2;
    printf("                          Druga macierz (B)

");
    printf(">>>>>>>>>>>>>>>>>>>>>>>>>>> Podaj jej wymiary <<<<<<<<<<<<<<<<<<<<<<<<<<<<

");
    printf("Podaj liczbe kolumn
");
    scanf("%d",&w);
    printf("Podaj liczbe wierszy
");
    scanf("%d",&q);
    printf("Podaj %d wartosci 

", q*w);
    macierz2=(int**)malloc(sizeof(int)*q);/*Dynamiczne wprowadzanie macierzy*/
    for(x=0;x<q;x++)
    macierz2[x]=(int*)malloc(sizeof(int)*w);
    for(x=0;x<q;x++)
    for(y=0;y<w;y++)
    {
          printf("Podaj liczbe ");
          scanf("%d",&macierz2[x][y]);
          }
    printf("                           Druga macierz (B):
");
    /*Wypisuje drugą tablice*/
    for(x=0;x<q;x++)
    {
          for(y=0;y<w;y++)
          {
                 printf("%d ", macierz2[x][y]);
                 }
          printf("
");
    }
    if ((a==w)&(b==q))
    {
          printf("Suma macierzy
");
          int wiersz,kolumna, w1=b,k1=a;
          int **macierz3;
          macierz3=(int**)malloc(sizeof(int)*k1);
              for(wiersz=0;wiersz<w1;wiersz++)
          macierz3[wiersz]=(int*)malloc(sizeof(int)*w1);
              for(kolumna=0;kolumna<k1;kolumna++)
                   for(wiersz=0;wiersz<w1;wiersz++)
                   {
                    macierz3[wiersz][kolumna]=macierz2[wiersz][kolumna]+macierz[wiersz][kolumna];
                    }
                    for(wiersz=0;wiersz<w1;wiersz++)
                    {
                          for(kolumna=0;kolumna<k1;kolumna++)
                          {  
                                printf("%d ", macierz3[wiersz][kolumna]);
                                }
                          printf("
");
                    }
                   }           
                   else
                   {
                          printf("Nie mozna dodac macierzy!!!!
 LICZE ILOCZYN MACIERZY

");
                          {
                                if(a==q)
                                {
                                printf("Iloczyn wykonywalny
 Wynik ilorazu obu macierzy to 
");
                                
                                int wiersz2, kolumna2, w2=b, k2=a, v, g;
                                int **macierz4;
                                
                                macierz4=(int**)malloc(sizeof(int)*k2);/*Dynamiczne wprowadzanie macierzy*/
                                     for(wiersz2=0;wiersz2<w2;wiersz2++)
                                macierz4[wiersz2]=(int*)malloc(sizeof(int)*w2);
                                     for(kolumna2=0;kolumna2<k2;kolumna2++)
                                         for(wiersz2=0;wiersz2<w2;wiersz2++)
                                         
                                              macierz4[wiersz2][kolumna2]=0;
                                              for(v=0;v<x;v++)
                                              for(g=0;g<y;g++)
                                              {
    macierz4[wiersz2][kolumna2]=macierz4[wiersz2][kolumna2]+macierz2[wiersz2][g]*macierz[v][kolumna2];
                                                                                                      }
                                                                                                      for(wiersz2=0;wiersz2<w2;wiersz2++)
                                                                                                      for(kolumna2=0;kolumna2<k2;kolumna2++) 
                                                                                                      printf("%d", macierz4[wiersz2][kolumna2]);
                                                                                                      printf("
");
                                                                                                      }
    

                                                                                                      else
                                                                                                      {
                                                                                                          printf("KONIEC");
                                                                                                          }
    }
}
getch();
}
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

Iloczyn macierzy

Post autor: miki999 »

Co to za typ:

Kod: Zaznacz cały

    scanf("%i", &a);
powinno być raczej "%d"- chyba że o czymś nie wiem


Co do programu to chyba algorytm jest niepoprawny:

Kod: Zaznacz cały

                                     for(kolumna2=0;kolumna2<k2;kolumna2++)
                                         for(wiersz2=0;wiersz2<w2;wiersz2++)
                                         
                                              macierz4[wiersz2][kolumna2]=0
Tutaj zerujesz macierz4- ok

A kolejne 5 linijek rzekomo ma wykonywać mnożenie? Gdzie masz przechodzenie do liczenia kolejnych elementów?

Ogólnie program zbyt elegancko nie wygląda. Jakbyś miał ochotę to na stronie:
są pliki mojego prowadzącego zajęcia z 'C'.
Mar_ko
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 6 lip 2010, o 13:09
Płeć: Mężczyzna
Lokalizacja: POLSKA
Podziękował: 2 razy

Iloczyn macierzy

Post autor: Mar_ko »

Dzięki za stronkę. Przeczytałem ale powiem szczerze, że mimo to nie rozumiem błędu który robię.
PMichalak
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 29 paź 2009, o 20:03
Płeć: Mężczyzna
Lokalizacja: Kalisz
Podziękował: 1 raz
Pomógł: 16 razy

Iloczyn macierzy

Post autor: PMichalak »

Sorry, ale nie chce mi sie przegladac kodu. Algorytm mnożenia to 4 linijki, mam nadzieje, ze bez problemu zrozumiesz, mimo, że nie jest w C.

Kod: Zaznacz cały

            
for (int x = 0; x < i; x++)
     for (int y = 0; y < j; y++)
          for (int z = 0; z < k; z++)
               R[x][y] += firstMatrix[x][z] * secondMatrix[z][y];
Pozdro.

edit: aha, i, j, k to wymiary macierzy, mnożymy macierz \(\displaystyle{ A _{i, j} \cdot A_{j, k}}\)
Ostatnio zmieniony 6 lip 2010, o 22:43 przez PMichalak, łącznie zmieniany 1 raz.
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

Iloczyn macierzy

Post autor: miki999 »

Kod: Zaznacz cały

                                              for(v=0;v<x;v++)
                                              for(g=0;g<y;g++)
                                              {
    macierz4[wiersz2][kolumna2]=macierz4[wiersz2][kolumna2]+macierz2[wiersz2][g]*macierz[v][kolumna2];
Opisz mi działanie tego fragmentu. Skąd program ma do macierzy4 wiersz2 i kolumna2?
Mar_ko
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 6 lip 2010, o 13:09
Płeć: Mężczyzna
Lokalizacja: POLSKA
Podziękował: 2 razy

Iloczyn macierzy

Post autor: Mar_ko »

Już sobie poradziłem jeszcze raz dzięki miki999 za link.
Pozdrawiam
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6908
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

Iloczyn macierzy

Post autor: Mariusz M »

Kod: Zaznacz cały

void multiply(double** D,double** A,double** B,int m,int p,int n){
       int i,j,k;
       double s;
          for(i=1;i<=m;i++){
             for(k=1;k<=p;k++) {
                s=0.0;
                for(j=1;j<=n;j++)
                   s+=A[i][j]*B[j][k];
                D[i][k]=s;
                }
          }
      }
powinno być raczej "%d"- chyba że o czymś nie wiem
Ja bym dał %u jak już albo modyfikator typu unsigned
ODPOWIEDZ