Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 10-11-2011 20:46:25

Golgup
Membre actif
Inscription : 09-07-2008
Messages : 574

[C++] Multiplication de deux matrices

Hello!

Pour changer voici un petit programme qui calcul le produit de deux matrices:

L'interface peut etre ameliorée mais je ne connais pas encore assez c++ pour l'instant.  Enfet on pouvait rendre beucoup plus simple le programme en utilisant les nouveaux tableaux <array> ou meme <vector> de c++11 (2011), mais d'une part beaucoup de gens n'y sont pas habitués et en plus, je retrouvais plein d'erreurs. Du coup je me retrouve avec trois "for" imbriqués. Pas facile de faire sans utiliser de definition!


#include <iostream>
using namespace std;

int main()
{
    int c1;
    int l2;
    int l1;
    int c2;
    do {
        cout << "Quel nombre de lignes de matrice 1 ?: " ;
        cin >> l1;
        cout << "Quel nombre de colones de matrice 1 ?: " ;
        cin >> c1;
        cout << "Quel nombre de lignes de matrice 2 ?: " ;
        cin >> l2;
        cout << "Quel nombre de colones de matrice 2 ?: ";
        cin >> c2;
    } while ( l2 != c1 );
   
   
double M1[l1][c1];
double M2[l2][c2];

cout << "" << endl;
cout << " MATRICE 1 " << endl;
cout << "" << endl;

for (int i(1) ; i <= l1 ; ++i){
    for (int j(1) ; j <= c1 ; ++j){
        cout << "M1[" << i << "," << j << "]=";
        cin >> M1[i][j];
       
    }
}
cout << "--------------------" << endl;

cout << "" << endl;
cout << " MATRICE 2 " << endl;
cout << "" << endl;


for (int k(1) ; k <= l2 ; ++k){
    for (int l(1) ; l <= c2 ; ++l){
        cout << "M2[" << k << "," << l << "]=";
        cin >> M2[k][l];
       
    }
}
cout << "" << endl;
cout << "RESULTAT : " << endl;
cout << "--------------------" << endl;

for ( int x(1) ; x<=l1 ; ++x){
    for (int r(1) ; r<=c2 ; ++r){
        int z(0);
        for (int y(1) ; y<=c1 ; ++y){
            z=z+M1[x][y]*M2[y][r];
            }
            cout << z << " ";
            if (r==c2){
                cout << "" << endl;
            }
               
        }
    }
return 0;
}
 


ps: Python est quand meme beaucoup plus agréable et facile!

Dernière modification par Golgup (11-11-2011 00:07:12)

Hors ligne

#2 09-12-2011 21:49:36

mseeker
Membre
Inscription : 27-10-2011
Messages : 5

Re : [C++] Multiplication de deux matrices

Bonsoir,

Une proposition pour éviter l'imbrication de boucles :


int x = 1,y=1,r=1;
int z=0;
while (x <= l1){
        if(y<=c1){
                z+=M1[x][y]*M2[y][r];
                y++;
        }
        else {
                y=1;
                cout << z << " ";
                z=0;
                if(r==c2){
                        cout << endl;
                        r=1;
                        x++;
                }
                else
                        r++;
        }
}
 

(pas à l'abri d'une erreur)

C'est pas tellement plus élégant mais le principe est utile lorsqu'on travaille sur un certain nombre de dimensions.

Remarques :
En vérifiant que le produit matriciel est bien défini tu pourrais éviter de demander à la fois le nombre de colonnes de M1 et le nombre de lignes de M2, tout en t'assurant que le produit a un sens.

Pour la multiplication de grandes matrices il existe l'aglorithme de Strassen qui est bien plus efficace.

Je ne me suis pas mis à jour niveau C++, mais le type vector de la STL existait déjà avant C++11.

Hors ligne

#3 05-05-2012 13:45:13

ngatilio
Membre
Inscription : 18-09-2010
Messages : 14

Re : [C++] Multiplication de deux matrices

C'est bien beau les codes mais faut gérer:
-->   la saisie (vous pouvez utiliser les MoveTo (j+x.pos(),i+y.pos()));
-->   gérer les erreurs . vous pouvez créer un classe  ErreurMatrice
//ou le constructeur  sera :

ErreurMatrice::ErreurMatrice(Int i)
{
   Switch(i)
    {
  Case 0 :  const char* message0 ="Ecrire le message d'erreur ici ";
              printf("%s",message);
             Break;
  Case 1: instructions 2;
             Break;
  etc...
    }

Int main()
{
if( booleen)
   {intructions;}
Else  Throw ErreurMatrice(0);

etc...
}

//pour gerer les erreurs( de taille , de mauvaise saisie , d'un caractere non reconnu etc...)
juste pour ameliorer vos codes
@++

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
vingt six plus quarantequatre
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums