Najszybszy sposób na mnożenie macierzy kwadratowej

0

Witam!

W programie muszę pomnożyć dwie macierze kwadratowe :

for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            macierzC[i][j]=0;
            for(int z=0; z<n; z++)
            {
                macierzC[i][j]+=macierz[i][z]*macierzB[z][j];


            }
        
        }
       
    } 

n to jest oczywiście rozmiar macierzy. Niestety ten sposób jest za wolny, zna ktoś jakąś szybszą metodę na mnożenie macierzy kwadratowych?

0

http://en.wikipedia.org/wiki/Strassen_algorithm

Jeśli powyższe nie wystarczy to trzeba szukać przyspieszenia problemu w inny sposób niż przyspieszanie samego mnożenia macierzy. Definicji problemu jednak nie sprecyzowałeś (no chyba, że to mnożenie jest celem samym w sobie, np dostałeś zadanie na ćwiczeniach).

Ewentualnie problem może leżeć gdzie indziej, np wymiary twoich macierzy mają rozmiar będący potęgami dwójek (lub bardzo bliski nim), przez co pamięć podręczna kiepsko działa w takim przypadku. Są metody na zwiększenie wykorzystania pamięci podręcznej przy mnożeniu macierzy - trik polega na podzieleniu macierzy wejściowych na podmacierze, mnożeniu podmacierzy, a następnie połączeniu wyniku.

0

To już powinno być nieco szybsze:

for(int i=0;i<n;+i)
  {
   for(int j=0;j<n;++j)
     {
      double sum=0; 
      for(int z=0;z<n;++z) sum+=macierz[i][z]*macierzB[z][j];
      macierzC[i][j]=sum;
     }
  }

Na niektórych kompilatorach to jeszcze przyspieszy:

for(int i=0;i<n;+i)
  {
   double *row=&macierz[i][0],*dst=&macierzC[i][0];
   for(int j=0;j<n;++j)
     {
      double sum=0; 
      for(int z=0;z<n;++z) sum+=row[z]*macierzB[z][j];
      dst[j]=sum;
     }
  }

Jak to nie pomoże to czytaj post wyżej, ale rewelacji się nie spodziewaj (ani z tym co podałem anie też z algorytmem Strassena).

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