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 :

multiplication de deux matrices en C


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 126
    Points : 0
    Points
    0
    Par défaut multiplication de deux matrices en C
    salut j ai pas réussi a ecrire un programme qui fait la multiplication de deux matrices en C par exemple:
    x=(0 _1 4) y=(1 -1 3)
    (1 3 5) (-1 1 2)
    xy=(1 -1 14)
    (-2 2 29)
    en va bien sur utiliser un tableau de 2 dimension
    est ce que quelque un peut me donner la formule a utiliser ou le code en C
    j ai chercher sus web la formule j au trouver sa http://en.wikipedia.org/wiki/Matrix_multiplication
    mais j ai rien compris
    merci d avance.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Pour multiplier deux matrices, il faut que la hauteur de l'un soit égale à la largueur de l'autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    |1| x |3 4| = |3 4|
    |2|           |6 8|
    L'exemple que tu donnes n'est pas une multiplication matricielle.

    Poste le code que tu as écrit même s'il ne fonctionne pas, nous essayerons de t'expliquer ce qui ne va pas.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 126
    Points : 0
    Points
    0
    Par défaut
    j ai fait un programme qui est pas beaucoup différent que de celui que je cherche c est de matrice carré voila le code:
    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
    #include<stdio.h>
    #include<stdlib.h>
    int t[3][3],i,j;
    main(){
     
           for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                      printf("\nDonner un nombre: ");
                      scanf("%d",&t[i][j]);
                }
           }
     
           for(i=0;i<3;i++){
                t[i][i]=0;
           }
     
           printf("\n");
     
           for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                      printf("%5d",t[i][j]);
                }
                printf("\n");
           }
     
           printf("\n");
     
           system("pause");
           return 0
    }
    que ce que je vais changer dans ce code pour avoir la multiplication de matrice que je cherche?

  4. #4
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    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
     
    int * MultMat(int *a,int *b,int n)
    {
        int *ptr = malloc(sizeof(int)*n*n+1);
        int tmp,i,j,k=0;
     
        if(ptr ==NULL)
             return NULL;
     
        for(i=0;i<n;i++)
        {
           tmp = 0;
           for(j=0;j<n;j++)
               tmp+=*(a*j+i) * *(b*i+j);
           *(ptr+k) = tmp;
           k++;
        }
     
      return ptr;
    }
    et dans ton main tu utilise comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main()
    {
       int *A = malloc(sizeof(int)*3*3+1);
       int *B = malloc(sizeof(int)*3*3+1);
     
        //.... apres avoir remplit les 2 matrices;
     
       int *R = MultMat(A,B,3);
     
       return 0;
    }
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    @komat
    Citation Envoyé par komat Voir le message
    j ai fait un programme qui est pas beaucoup différent que de celui que je cherche c est de matrice carré voila le code:
    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
    #include<stdio.h>
    #include<stdlib.h>
    int t[3][3],i,j;
    main(){
     
           for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                      printf("\nDonner un nombre: ");
                      scanf("%d",&t[i][j]);
                }
           }
     
           for(i=0;i<3;i++){
                t[i][i]=0;
           }
     
           printf("\n");
     
           for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                      printf("%5d",t[i][j]);
                }
                printf("\n");
           }
     
           printf("\n");
     
           system("pause");
           return 0
    }
    que ce que je vais changer dans ce code pour avoir la multiplication de matrice que je cherche?
    Hum, ton code ne fait pas grand chose à part demander et afficher une matrice.

    Calcul de C = A x B :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int A[3][3];
    int B[3][3];
    int C[3][3];
     
    for(i = 0; i < 3; ++i) {
        for(j = 0; j < 3; ++j) {
            C[i][j] = 0;
            for(k = 0; k < 3; ++k) {
                C[i][j] = C[i][j] + A[i][k] * B[k][j];
            }
        }
    }
    La boucle sur k permet de calculer chaque Cij (Cij = Somme(Aik * Bkj)) cf http://upload.wikimedia.org/math/4/2...c6c57039bc.png

    Les boucles sur i et j permettent de réaliser le calcul de tous les Cij

    PS : merci de penser à la balise CODE

    @lilington
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp+=*(a*j+i) * *(b*i+j);
    Tu es sur de toi ?

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 126
    Points : 0
    Points
    0
    Par défaut
    mabu ta oublier de declarer les compteur mais ton code sa marche pas:




    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
    #include<stdio.h>
    #include<stdlib.h>
    int main(){
        int A[3][3];
         int B[3][3];
          int C[3][3];
          int i,j,k;
     
      for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            C[i][j]=0;
            for(k=0;k<3;k++){
                C[i][j]=C[i][j]+A[i][k]*B[k][j];
            }
        }
    }
    system("pause");
    return 0;
    }
    il ya aucun faute de syntaxe mais le programme affiche rien

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par komat Voir le message
    mabu ta oublier de declarer les compteur mais ton code sa marche pas:

    il ya aucun faute de syntaxe mais le programme affiche rien
    As tu lu le code et essayé de le comprendre ?
    Ce code ne fait QUE le multiplication.

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 126
    Points : 0
    Points
    0
    Par défaut
    teste se code et regarde que ce que sa donne:
    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
    #include<stdio.h>
    #include<stdlib.h>
    int main(){
    int A[3][3];
    int B[3][3];
    int C[3][3];
    int i,j,k;
     
    for(i=0;i<3;i++){
    for(j=0;j<3;j++){
                    printf("\nDonner un nombre: ");
                      scanf("%d",&A[i][j]);
                       printf("\nDonner un nombre: ");
                      scanf("%d",&B[i][j]);
    C[i][j]=0;
    for(k=0;k<3;k++){
    C[i][j]=C[i][j]+A[i][k]*B[k][j];
    printf("%d",C[i][j]);
    }
    }
    }
    system("pause");
    return 0;
    }
    il fait la multiplication mais il me donne des nombres bizarre après le résultats.
    sil te plait il vaut mieux le tester pour savoir mieux et dit moi ou se trouve la faute.

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par komat Voir le message
    teste se code et regarde que ce que sa donne:
    Sans tester, je peux te dire qu'il y a un problème : tu commence à calculer les coefficients de C alors que tes matrices A et B ne sont pas encore initialisées !

    Donc :
    1. Demander à l'utilisateur de remplir la matrice A
    2. Demander à l'utilisateur de remplir la matrice B
    3. Afficher la matrice A
    4. Afficher la matrice B
    5. Effectuer le calcul
    6. Afficher la matrice C

    Pour plus de facilités, je te conseille d'écrire trois fonctions pour organiser ton programme :
    1. remplir_matrice
    2. afficher_matrice
    3. multiplication



    PS : Merci d'utiliser la balise code : http://club.developpez.com/aidenouve...es/Balises.gif

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 126
    Points : 0
    Points
    0
    Par défaut
    mabu voila le code c est résolu :
    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
    60
    61
    62
    63
    64
    65
    66
     
    #include<stdio.h>
    #include<stdlib.h>
    int A[3][3];
    int B[3][3];
    int C[3][3];
    int i,j,k;
     
    int main(){
        //La saisie de la premiere matrice
        for(i=0;i<3;i++){
            for(j=0;j<3;j++){
                printf("A[%d][%d] = ",i,j);
                scanf("%d",&A[i][j]);
            }
        }  
     
        printf("\n");
        //La saisie de la premiere matrice
        for(i=0;i<3;i++){
            for(j=0;j<3;j++){
                printf("B[%d][%d] = ",i,j);
                scanf("%d",&B[i][j]);
            }
        }
     
        C[0][0]=0;
        //Le calcul de la multiplication
        for(i=0;i<3;i++){
            for(j=0;j<3;j++){
                for(k=0;k<3;k++){
                    C[i][j]=C[i][j]+A[i][k]*B[k][j];
                }
            }
        }
        //L'affichage de la première matrice
        printf("\n A = \n");
     
        for(i=0;i<3;i++){
            for(j=0;j<3;j++){
                printf("\t%d",A[i][j]);
            }
            printf("\n");
        }
        //L'affichage de la deuxième matrice
        printf("\n B = \n");
     
        for(i=0;i<3;i++){
            for(j=0;j<3;j++){
                printf("\t%d",B[i][j]);
            }
            printf("\n");
        }
        //L'affichage de la multiplication des deux matrices
        printf("\n A * B = \n");
     
        for(i=0;i<3;i++){
            for(j=0;j<3;j++){
                printf("\t%d",C[i][j]);
            }
            printf("\n");
        }
     
        system("pause");
        return 0;
    }
    merci pour l aide

  11. #11
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    Citation Envoyé par mabu Voir le message
    @lilington

    Tu es sur de toi ?
    hehe, une petite erreure ca arrive. merci de me l'avoir rappeller.
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 126
    Points : 0
    Points
    0
    Par défaut
    quelle erreur vous êtes sur si il y a une erreurs sur mon code vous l dites

  13. #13
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par komat Voir le message
    quelle erreur vous êtes sur si il y a une erreurs sur mon code vous l dites
    L'erreur que j'ai soulevé se trouvait dans le code posté par lilington.

    Sinon, j'ai testé ton code, il a l'air correct.

  14. #14
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 126
    Points : 0
    Points
    0
    Par défaut
    merci les amies pour l aide
    votre forum est très efficace

  15. #15
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        C[0][0]=0;
        //Le calcul de la multiplication
        for(i=0;i<3;i++){
            for(j=0;j<3;j++){
                for(k=0;k<3;k++){
                    C[i][j]=C[i][j]+A[i][k]*B[k][j];
                }
    Attention, ce code ne marche que parce que C[][] est déclaré en global donc entièrement initialisé par 0 (et le C[0][0] = 0 fait penser que tu ne l'a pas fait exprès).
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  16. #16
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 126
    Points : 0
    Points
    0
    Par défaut
    merci pour cette indication

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. multiplication de deux matrices
    Par armand22 dans le forum Débuter
    Réponses: 7
    Dernier message: 05/02/2013, 20h48
  2. multiplication de deux matrice sous matlab
    Par khalil.ajmi dans le forum MATLAB
    Réponses: 4
    Dernier message: 12/05/2010, 16h04
  3. multiplication de deux matrices
    Par ikuzar dans le forum Débuter
    Réponses: 2
    Dernier message: 19/10/2009, 14h38
  4. Calcul de la multiplication de deux matrices
    Par al_alias dans le forum Pascal
    Réponses: 2
    Dernier message: 30/05/2007, 22h37

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