J'ai essayé d'implémenter le Strassen algorithm pour la multiplication matricielle en C++, mais le résultat n'est pas celui-là, ce à quoi je m'attendais. Comme vous pouvez le voir, strassen prend toujours plus de temps que l'implémentation standard et seulement avec une dimension d'une puissance de 2 est aussi rapide que l'implémentation standard. Qu'est ce qui ne s'est pas bien passé? Multiplication de la matrice: Strassen vs. Standard
matrix mult_strassen(matrix a, matrix b) {
if (a.dim() <= cut)
return mult_std(a, b);
matrix a11 = get_part(0, 0, a);
matrix a12 = get_part(0, 1, a);
matrix a21 = get_part(1, 0, a);
matrix a22 = get_part(1, 1, a);
matrix b11 = get_part(0, 0, b);
matrix b12 = get_part(0, 1, b);
matrix b21 = get_part(1, 0, b);
matrix b22 = get_part(1, 1, b);
matrix m1 = mult_strassen(a11 + a22, b11 + b22);
matrix m2 = mult_strassen(a21 + a22, b11);
matrix m3 = mult_strassen(a11, b12 - b22);
matrix m4 = mult_strassen(a22, b21 - b11);
matrix m5 = mult_strassen(a11 + a12, b22);
matrix m6 = mult_strassen(a21 - a11, b11 + b12);
matrix m7 = mult_strassen(a12 - a22, b21 + b22);
matrix c(a.dim(), false, true);
set_part(0, 0, &c, m1 + m4 - m5 + m7);
set_part(0, 1, &c, m3 + m5);
set_part(1, 0, &c, m2 + m4);
set_part(1, 1, &c, m1 - m2 + m3 + m6);
return c;
}
PROGRAMME
matrix.h http://pastebin.com/TYFYCTY7
http://pastebin.com/wYADLJ8Y
matrix.cpp main.cpp http://pastebin.com/48BSqGJr
g++ main.cpp matrix.cpp -o matrix -O3
.
Vous devez fournir le résultat actuel et le résultat attendu (et peut-être la fonction de multiplication) si vous voulez que quelqu'un vous aide. Mettre tout le code est trop. Une autre chose, si la question est pour les devoirs, s'il vous plaît ajouter le drapeau des devoirs –
Ce n'est pas un devoir. Je suis juste intéressé par l'implémentation de l'algorithme strassen, car il devrait être plus rapide. Standard a la complexité de O (n^3) et strassen O (n^2.8), parce qu'il a besoin d'une multiplication de moins. – multiholle