Multiplication matricielle

Multiplication matricielle - C - Programmation

Marsh Posté le 05-10-2006 à 17:13:33    

J'essaye de faire un programme pour multiplier des matrices carrées.  
 
Pour ce faire j'utilise la ligne suivante dans une boucle:
 

Code :
  1. MatriceResultat[ligne][colonne]=+(matriceA[ligne][curseur]*matriceB[curseur][colonne]);


Cela équivaut à la formule: http://gersoo.free.fr/Images/docs/stras/stra02.gif
 
J'utilise cette ligne dans une boucle (le curseur allant de 0 à la taille de la matrice-1). Je répète tout ça pour chaque "case" de la matrice du résultat biensûr.
 
Ca donne:
 

Code :
  1. void multiplier(int matA[M][M],int matB[M][M],int resultat[M][M]){
  2.      int ligne,colonne,curs;
  3.      zero(resultat); //mise à zéro de tous les coefficients de la matrice resultat
  4.    
  5.      //On parcours chaque ligne:
  6.      for(ligne=0;ligne<M;ligne++)
  7.         //On parcours chaque coefficient de la ligne:
  8.         for(colonne=0;colonne<M;colonne++)
  9.            //Calcul d'un coefficient (ligne,colonne) de la matrice resultat:
  10.            for(curseur=0;curseur<M;curseur++){
  11.            resultat[ligne][colonne]=+(matA[ligne][curseur]*matB[curseur][colonne]);
  12.            }
  13. }


 
Le problème est que ça ne fonctionne pas comme vous vous en doutez. Mais je voudrai juste savoir si vous auriez fait la même chose que moi pour la formule du dessus?
 
Merci pour votre aide ;)

Reply

Marsh Posté le 05-10-2006 à 17:13:33   

Reply

Marsh Posté le 05-10-2006 à 17:16:15    

=+ ?
c'est pas += ?


---------------
Töp of the plöp
Reply

Marsh Posté le 05-10-2006 à 17:19:21    

_darkalt3_ a écrit :

=+ ?
c'est pas += ?


 
 [:cupra]  Je suis vraiment tête en l'air!
 
Je viens de me remotiver à refaire du C après 6 mois d'inactivité [:totoz]  C'est impressionant tous les automatismes que j'ai perdu!
 
Merci beaucoup sinon je vais voir ça.
 
Edit: Oui c'est bon c'est ça. Tu  m'a évité de perdre beaucoup de temps.
 

Code :
  1. /*Programme d'opérations sur des matrices carrées d'ordre M*/
  2. Voilà mon programme on sait jamais ça peut servir pour ceux qui tomberont sur le sujet par google ou autre:
  3. #include <stdio.h>
  4. #define M 4
  5. //Définition des fonctions
  6. void afficher(int tab[M][M]){
  7.      int ligne,colonne;
  8.      printf("\n" );
  9.      for(ligne=0;ligne<M;ligne++){
  10.         for(colonne=0;colonne<M;colonne++)
  11.            printf("\t%d",tab[ligne][colonne]);
  12.         printf("\n" );
  13.         }
  14.      }
  15.    
  16. void unite(int tab[M][M]){
  17.      int ligne,colonne;
  18.    
  19.      for(ligne=0;ligne<M;ligne++){
  20.         for(colonne=0;colonne<M;colonne++)
  21.            if(colonne==ligne)
  22.               tab[ligne][colonne]=1;
  23.            else
  24.               tab[ligne][colonne]=0;
  25.      }
  26. }
  27. void zero(int tab[M][M]){
  28.      int ligne,colonne;
  29.    
  30.      for(ligne=0;ligne<M;ligne++)
  31.         for(colonne=0;colonne<M;colonne++)
  32.         tab[ligne][colonne]=0;
  33. }
  34. void initialiser(int tab[M][M]){
  35.      int ligne,colonne;
  36.    
  37.      for(ligne=0;ligne<M;ligne++)
  38.         for(colonne=0;colonne<M;colonne++)
  39.         tab[ligne][colonne]=ligne+colonne;
  40. }
  41. void multiplier(int matA[M][M],int matB[M][M],int res[M][M]){
  42.      int ligne,colonne,curs;
  43.      zero(res);
  44.    
  45.      for(ligne=0;ligne<M;ligne++)
  46.         for(colonne=0;colonne<M;colonne++)
  47.            for(curs=0;curs<M;curs++){
  48.            res[ligne][colonne]+=(matA[ligne][curs]*matB[curs][colonne]);
  49.            }
  50. }
  51. void additionner(int matA[M][M],int matB[M][M],int res[M][M]){
  52.      int ligne,colonne,curs;
  53.      zero(res);
  54.    
  55.      for(ligne=0;ligne<M;ligne++)
  56.         for(colonne=0;colonne<M;colonne++)
  57.         res[ligne][colonne]=matA[ligne][colonne]+matB[ligne][colonne];
  58.          
  59. }
  60. //Début du programmme!
  61. void main()
  62. {
  63.      int matriceA[M][M],matriceB[M][M],resultat[M][M];
  64.    
  65.      //Les matrices A et B sont converties en matrices unité:
  66.      unite(matriceA); unite(matriceB);
  67.      afficher(matriceA); afficher(matriceB);
  68.    
  69.      //La matrice qui contiendra le résultat est remplie de zéros:
  70.      zero(resultat); afficher(resultat);
  71.    
  72.      //On multiplie les 2 matrices A et B: on insère le résultat dans la matrice resultat:
  73.      multiplier(matriceA,matriceB,resultat); afficher(resultat);
  74.    
  75.      system("PAUSE" );
  76. }


Message édité par ngkreator le 05-10-2006 à 17:21:55
Reply

Marsh Posté le 05-10-2006 à 18:47:06    

juste une remarque en passant : en pratique il est souvent plus rapide d'effectuer la sommation sur une variable temporaire qu'on recopie après dans la case de la matrice (ne me demande pas pourquoi, je sais pas vraiment)
 

Code :
  1. void multiplier(int matA[M][M],int matB[M][M],int resultat[M][M]){
  2.      int ligne,colonne,curs;
  3.      zero(resultat); //mise à zéro de tous les coefficients de la matrice resultat
  4.    
  5.      //On parcours chaque ligne:
  6.      for(ligne=0;ligne<M;ligne++)
  7.         //On parcours chaque coefficient de la ligne:
  8.         for(colonne=0;colonne<M;colonne++){
  9.            //Calcul d'un coefficient (ligne,colonne) de la matrice resultat:
  10.            int tmp = 0;
  11.            for(curseur=0;curseur<M;curseur++)
  12.               tmp += (matA[ligne][curseur]*matB[curseur][colonne]);
  13.            }
  14.            resultat[ligne][colonne] = tmp;
  15. }


 
je sais pas si ça t'intéresse, mais au cas où...


Message édité par franceso le 05-10-2006 à 18:48:07

---------------
TriScale innov
Reply

Marsh Posté le 05-10-2006 à 19:04:28    

Plus rapide?

Reply

Marsh Posté le 05-10-2006 à 19:31:02    

oui, car la somme se fait dans une variable temporaire qui a toutes les chances d'être dans un registre.
au passage, une déclaration
 
register int tmp = 0;
 
serait + explicite

Reply

Marsh Posté le 06-10-2006 à 09:44:20    

jesus_christ +1 :)

Reply

Marsh Posté le 06-10-2006 à 10:46:04    

jesus_christ a écrit :

oui, car la somme se fait dans une variable temporaire qui a toutes les chances d'être dans un registre.

Il y a aussi il me semble le fait que si resultat est un pointeur, ton compilo fait extrêment gaffe aux problèmes d'aliasing et du coup certaines optimisations ne peuvent pas être faites.


---------------
TriScale innov
Reply

Marsh Posté le 06-10-2006 à 19:32:08    

exact, il vaut mieux déréférencer, calculer puis remettre en mémoire ;)

Reply

Marsh Posté le 06-10-2006 à 19:37:04    

Ca risquerais pas un ptit peut de faire mal si les entiers sont un poil trop gros ?
 
( ce qui va vite quand on fait la somme de plusieurs produits :/ )

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed