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 :

Matrice et operateurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 45
    Par défaut Matrice et operateurs
    onjour!

    Voilà, j'essaye de créer une classe de matrices avec la surcharge d'opérateurs mais je dois tester si les matrices sont d'un ordre compatible

    Par exemple, je ne peux additionner que des matrices de même ordre (n x m)
    ou quand je multiplie deux matrices entre-elles, l'ordre des matrices doit être (n x m) * (m x p)
    Il faut donc que je teste avant d'effectuer le calcul et ceci se fait... pas bien! Voici la fonction que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Matrice Matrice::operator+(const Matrice &matrice)
    {
        Matrice resultat = *this;
        for (int i = 0; i < m_y; ++i)
            for (int j = 0; j < m_x; ++j)
                resultat.m_matrice[i][j] += matrice.m_matrice[i][j];
        return resultat;
    }
    Le problème dans ce code c'est qu'on renvoie un objet de la classe matrice dans tous les cas, alors qu'on ne devrait rien renvoyer si le calcul est impossible... Hum

    Comment faire?
    merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Ben tu testes les longueurs et largeurs et tu lances une exception si ça ne s'accorde pas.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par dev0077 Voir le message
    onjour!

    Voilà, j'essaye de créer une classe de matrices avec la surcharge d'opérateurs mais je dois tester si les matrices sont d'un ordre compatible

    Par exemple, je ne peux additionner que des matrices de même ordre (n x m)
    ou quand je multiplie deux matrices entre-elles, l'ordre des matrices doit être (n x m) * (m x p)
    Il faut donc que je teste avant d'effectuer le calcul et ceci se fait... pas bien! Voici la fonction que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Matrice Matrice::operator+(const Matrice &matrice)
    {
        Matrice resultat = *this;
        for (int i = 0; i < m_y; ++i)
            for (int j = 0; j < m_x; ++j)
                resultat.m_matrice[i][j] += matrice.m_matrice[i][j];
        return resultat;
    }
    Le problème dans ce code c'est qu'on renvoie un objet de la classe matrice dans tous les cas, alors qu'on ne devrait rien renvoyer si le calcul est impossible... Hum

    Comment faire?
    merci
    Si tu ne veut pas faire des exeptions. tu devrait definir un booleen qui indique que le resultat est faux.
    mat = mat2 + mat3;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (mat.Error() ) std::cout<<"erreur de calcul"<<std::endl;

    Juste pour ajouter une raison d'utiliser un tableau 1D au lieu de 2D, est que tu peut faire des opérations comme cela avec un seul for et donc de manière plus rapide.



    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
    class matrice
    {
    .
    .
    .
    std::vector<int> matrice;
    }
     
     
     
    Matrice Matrice::operator+(const Matrice &matrice)
    {
     
        Matrice resultat = *this;
        for (int i = 0; i <resultat.matrice.size(); ++i)
                resultat.m_matrice[i] += matrice.m_matrice[i];
     
        return resultat;
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Le mieux est encore de l'interdire à la compilation à coup de templates...

    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
     
    template<T,l,h> Matrice : private Matrice_Impl<T>
    {
       public:
             inline Matrice() : Matrice_Impl(l,h) {}
     
             inline Matrice(const Matrice<T,l,h>& mat) : Matrice_Impl(l,h)
             { set(mat,l,h); }
     
             inline Matrice<l,h>& operator=(const Matrice<T,l,h>& mat)
             { set(mat,l,h); return *this; }
     
     
             inline Matrice<T,l,h>& operator+=(const Matrice<T,l,h>& mat)
             { add(mat,l,h); return *this; }
             inline Matrice<T,l,h> operator+(const Matrice<T,l,h>& mat) const
             { Matrice<T,l,h> ret(*this); ret += mat; return ret; }
     
             ...
    };
     
    template<T,w,hw,h> Matrice<T,w,h> operator* (const Matrice<T,w,wh>& left, const Matrice<T,wh,h>& right)
    { ... }

Discussions similaires

  1. operateur & entre les matrices
    Par genie-netcom dans le forum MATLAB
    Réponses: 2
    Dernier message: 22/02/2012, 22h21
  2. [CR] entête et pied sur page 1/B de matrice
    Par chloe.j3 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 04/09/2002, 12h07
  3. Matrice de filtrage ?
    Par gimlithedwarf dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 24/08/2002, 09h44
  4. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  5. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 21h01

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