Optimisé matrice de la multiplication dans C

Je suis en train de comparer les différentes méthodes de multiplication de matrice.
La première est la méthode normale:

do
{
    for (j = 0; j < i; j++)
    {
        for (k = 0; k < i; k++)
        {
            suma = 0;
            for (l = 0; l < i; l++)
                suma += MatrixA[j][l]*MatrixB[l][k];
                MatrixR[j][k] = suma;
            }
        }
    }
    c++;
} while (c<iteraciones);

Le second se composent de la transposition de la matrice B en premier et ensuite faire la multiplication par les lignes:

int f, co;
for (f = 0; f < i; f++) {
    for ( co = 0; co < i; co++) {
        MatrixB[f][co] = MatrixB[co][f];
    }
}

c = 0;
do
{
    for (j = 0; j < i; j++)
    {
        for (k = 0; k < i; k++)
        {
            suma = 0;
            for (l = 0; l < i; l++)
                suma += MatrixA[j][l]*MatrixB[k][l];
                MatrixR[j][k] = suma;
            }
        }
     }
     c++;
} while (c<iteraciones);

La deuxième méthode censé être beaucoup plus rapide, parce que nous sommes accéder à la mémoire contiguë slots, mais je ne suis pas d'obtenir une amélioration significative de la performance. Suis-je en train de faire quelque chose de mal?

Je peux poster le code complet, mais je pense n'est pas nécessaire.

  • Sauf si vous implémentez votre propre de la matrice de la multiplication des routines comme un exercice d'apprentissage, vous devriez sérieusement envisager d'utiliser un existant, de les contrôler, bibliothèque optimisée tels que BLAS ou LAPACK.
  • Le premier fragment a 3 { et 4 }. Mon impression est que le plus profond } n'est pas voulu du tout, et la cession MatrixR[j][k] = suma; ne fait pas partie des intimes for boucle, malgré le retrait (de sorte qu'il est mis en retrait; elle doit être au même niveau que suma = 0;).
  • Cette réponse pourrait être utile: stackoverflow.com/a/54546544/3234205
InformationsquelleAutor Peter | 2009-12-15