IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

multiplier 2 matrices


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Points : 11
    Points
    11
    Par défaut multiplier 2 matrices
    en fait j ai un probleme de faire la multiplication de deux matrices surtout que je me suis obligé d utuliser ce 2 structure


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct _cellule{
      int nbZeroGauche, nbZeroHaut;/* nb de zéo à gauche et en haut de la cellule */
      double valeur;/* valeur de la cellule */
      struct _cellule *suivanteBas, *suivanteDroite;
    }cellule;
     
    typedef struct _matrice{
      cellule **colonne, **ligne;
      int tailleColonne, tailleLigne;
    }matrice;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    matrice *MultiplierrMatrices2(matrice *m1,matrice *m2,matrice *mul){
      int i,j, val, nbZeroGauche, *nbZeroHaut, *XCel1, *XCel2;
      double valpdt;
      cellule *cel, **celHaut=NULL, *celPrec=NULL;
     
      /* on test que les matrices aient le même format sinon on retourn NULL */
      if(m1->tailleLigne != m2->tailleColonne || m1->tailleLigne != m2->tailleColonne)
        return NULL;
     
      mul->tailleLigne=m1->tailleLigne;
      mul->tailleColonne=m2->tailleColonne;
      mul->ligne=(cellule**)malloc(sizeof(cellule*)*mul->tailleLigne);
      mul->colonne = (cellule**)malloc(sizeof(cellule*)*mul->tailleColonne);
     
      nbZeroHaut = (int*)malloc(sizeof(int)*mul->tailleColonne);
      celHaut = (cellule**)malloc(sizeof(cellule*)*mul->tailleColonne);
     
      for(i=0;i<mul->tailleColonne;i++){
        nbZeroHaut[i]=0;
        celHaut[i] = NULL;
      }
     
      for(i=0;i<mul->tailleLigne; i++){
        nbZeroGauche = 0;/* permet de retenir le nb de 0 entre la prochaine cellule et la cellule la plus à doirte de la ligne */
        celPrec = NULL;/* permet de retenir la dernière celulle la plus à droite dans la ligne */
        for(j=0;j<mul->tailleColonne;j++){
     
          valpdt = valeurCellule(m1, i, j) * valeurCellule(m2, i, j) + valeurCellule(m1, i, j+1) * valeurCellule(m2, i, j+1);
     
     
         if(valpdt==0){/* on retient qu'il ne faut pas ajouter de cellule et on ajoute un zéro */
            nbZeroHaut[j]++;
            nbZeroGauche++;
          }else{/* on ajoute la cellule dans la matrice produit */
            cel = (cellule*)malloc(sizeof(cellule));
            cel->suivanteBas = cel->suivanteDroite = NULL;
            cel->valeur = valpdt;
            cel->nbZeroGauche = nbZeroGauche;
            cel->nbZeroHaut = nbZeroHaut[j];
            nbZeroGauche = 0;
            nbZeroHaut[j] = 0;
            if(celHaut[j]){/* si on a retenu qu'on a déjà fait une cellule dans cette colonne, on lui dis que la suivante est celle qu'on vien de créer */
              celHaut[j]->suivanteBas = cel;
            }else/* on n'a encore rien ajouter dans la case de produit, donc on le fait :) */
              mul->colonne[j] = cel;
            /* puis, on met la cellule adns le tableau afin de lui affecter plus tard la suivante si il y en aura une */
            celHaut[j] = cel;
            if(celPrec)/* pareil qu'avant mais on teste sur la ligne */
               celPrec->suivanteDroite = cel;
            else
              mul->ligne[i] = cel;
            celPrec = cel;
          }
        }
      }
      free(nbZeroHaut);
      free(celHaut);
      return mul;
    }
    merci d avance

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Tu as oublié d'expliquer comment ta matrice est codée.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par matafan Voir le message
    Tu as oublié d'expliquer comment ta matrice est codée.
    je pas compris

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    Bonsoir

    Pouvez vous donner des précisions sur les besoins ? la taille est variables.

    Vous passez par "mul". Si j'ai bien compris le malloc peut être faire en fonction tailleColonne, tailleLigne d'une des deux matrices d'entrée. L'allocation servant a mémoriser le résultat et pourquoi pas les résultats intermédiaires

    pour le calcul : http://www.unilim.fr/pages_perso/jea...rices.htm#II.D
    l'exemple est pas mal

    Enfin tout çà dépend de votre besoin.

    bon courage

Discussions similaires

  1. Multiplier 2 Matrices vecteurs
    Par tomtom94500 dans le forum Maple
    Réponses: 0
    Dernier message: 09/07/2012, 12h30
  2. normales à multiplier par matrice objet ?
    Par laurencew dans le forum OpenGL
    Réponses: 10
    Dernier message: 26/06/2011, 17h12
  3. Méthode générale pour multiplier 2 matrices
    Par crissmindfreak dans le forum Pascal
    Réponses: 1
    Dernier message: 20/10/2010, 20h28
  4. Réponses: 6
    Dernier message: 18/06/2010, 13h34
  5. [Minitab] Comment multiplier des matrices ?
    Par rg0962 dans le forum Autres outils décisionnels
    Réponses: 1
    Dernier message: 08/01/2008, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo