Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3102 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Multiplication matricielle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Multiplication matricielle

n°1452925
ngkreator
Posté le 05-10-2006 à 17:13:33  profilanswer
 

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 ;)

mood
Publicité
Posté le 05-10-2006 à 17:13:33  profilanswer
 

n°1452932
_darkalt3_
Proctopathe
Posté le 05-10-2006 à 17:16:15  profilanswer
 

=+ ?
c'est pas += ?


---------------
Töp of the plöp
n°1452939
ngkreator
Posté le 05-10-2006 à 17:19:21  profilanswer
 

_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
n°1453020
franceso
Posté le 05-10-2006 à 18:47:06  profilanswer
 

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
n°1453028
ngkreator
Posté le 05-10-2006 à 19:04:28  profilanswer
 

Plus rapide?

n°1453037
jesus_chri​st
votre nouveau dieu
Posté le 05-10-2006 à 19:31:02  profilanswer
 

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

n°1453208
bb138
La vie est belle ...
Posté le 06-10-2006 à 09:44:20  profilanswer
 

jesus_christ +1 :)

n°1453244
franceso
Posté le 06-10-2006 à 10:46:04  profilanswer
 

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
n°1453618
jesus_chri​st
votre nouveau dieu
Posté le 06-10-2006 à 19:32:08  profilanswer
 

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

n°1453622
0x90
Posté le 06-10-2006 à 19:37:04  profilanswer
 

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 :/ )


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Multiplication matricielle

 

Sujets relatifs
multiplication de 2 matricesboucle while: table de multiplication
Multiplication de deux matricesmultiplication et overflow
[Assembleur] Problème avec la multiplication[SQL] Multiplication de colonne
Algo FFT et multiplication rapideinversion matricielle
multiplication de matrices[C] Multiplication de polynômes. Ce code est-il OK ? [Résolu]
Plus de sujets relatifs à : Multiplication matricielle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR