[C++] Mnożenia macierzy

0

Proszę o pomoc w poprawie mojego kodu. Wynik wychodzi 2 razy większy tzn. 2 macierze 2x2 i wszędzie 1 powinno być 2x2 i po 2 a u mnie jest 2x2 i 4-órki.

 
#include <iostream>
using namespace std;
int main()
{
   cout << "Podaj wymiary pierwszej tablicy(ilosc wierszy, ilosc kolumn):\n";
   int a1, a2;
   cin >> a1 >> a2;
   int taba[a1][a2];

   cout << "Podaj liczby macierzy pierwszej:\n";
   for(int i=0;i<a1;i++)
   {
       for(int j=0;j<a2;j++)
       {
           cin >> taba[i][j];
       }
   }

   cout << "Podaj wymiary drugiej tablicy (ilosc wierszy, ilosc kolumn):\n";
   int b1, b2;
   cin >> b1 >> b2;
   int tabb[b1][b2];

   cout << "Podaj liczby macierzy drugiej:\n";
   for(int i=0;i<b1;i++)
   {
       for(int j=0;j<b2;j++)
       {
           cin >> tabb[i][j];
       }
   }
   int tabc[a1][b2];
   for(int i=0;i<a1;i++)
   {
        for(int j=0;j<b2;j++)
        {
            tabc[i][j]=0;
        }
    }
   
   for(int i=0;i<a1;i++)
   {
        for(int j=0;j<b2;j++)
        {
            for(int k=0;k<a1;k++)
            {
                    for(int m=0;m<b2;m++)
                    {
                         tabc[i][j]=taba[k][m]*tabb[m][k]+tabc[i][j];   
                        
                    }
            }
        }
   }
   
   for(int i=0;i<a1;i++)
   {
        for(int j=0;j<b2;j++)
        {
            cout << tabc[i][j] << " ";
        }
        cout << "\n";
    }
 
  

system("pause");
return 0;
}

Z góry dzięki za pomoc
Pozdrawiam
Crasti

1

Przyjmijmy, że mnożysz macierze tak:

         Macierz 2|
                  |
                  | c  .
Macierz 1         | d  .
------------------+-----------
             a  b | e  .   <-- Wynik
             .  . | .  .

. = coś tam, co nas nie obchodzi

Zgodnie z twoim kodem zostanie przypisane: e = ac + ad + bc + bd. A ma przecież być e = ac + bd. Zauważ, że w przypadku poprawnego mnożenia zawsze zajdzie k=m (np. a*c ==> k=1, bo a to 1. kolumna macierzy pierwszej i m=1, bo c to 1. wiersz macierzy drugiej). Wywalasz więc najgłębszą pętlę. Dalej: jak wiemy, e będzie leżało w j-tej kolumnie i i-tym wierszu macierzy. Musisz zauważyć, że:

  • a leży w i-tym wierszu i k-tej kolumnie 1-szej macierzy.
  • b leży też w i-tym wierszu i k-tej kolumnie 1-szej macierzy (ale dla k=2).
  • c leży w k-tym wierszu i w j-tej kolumnie drugiej macierzy,
  • d tak samo.
    W takim razie dodawanie będzie brzmiało tak:
    tabc[i][j] += taba[k][j]*tabb[i][k] // += to tyle, co zwiększ zmienną o tyle...
    Mam nadzieję, że napisałem zrozumiale...

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