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 dans un vecteur


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Matrice dans un vecteur
    Bonjour à tous,

    Dans mon programme, je remplis, pour une image donnée, une matrice allouée dynamiquement. Cette matrice est déclarée à l'extérieur et remplie à l'intèrieur d'une fonction.

    'height' et 'width' sont les dimensions de mon image.
    Je ne les connais pas à l'avance puisque les images changent régulièrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    int **Img;
    Img = (int**)malloc(height*sizeof(int*));
    for (int i = 0; i < height; ++i)
    {
            Img[i] = (int*)malloc(width*sizeof(int));
    }
    Cette facon de faire fonctionne pour une seule image.

    A présent, je voudrai réaliser ceci pour un nombre donné d'images, mais dont les dimensions sont identiques.

    J'aimerais faire quelque chose dans le genre:
    Une déclaration en amont, en attente de la taille exacte du nombre d'image (NbImg) et des dimensions de l'image (Width, Height).

    Je ne connais le nombre d'image qu'une fois les images chargées.
    donc comment reserver dans mon vecteur NbImg 'emplacements' de dimensions Width*Height, pour la matrice?

    mais je ne sais pas comment m'y prendre.

    Est ce que quelqu'un pourrait m'aider ?
    Merci

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Ouch... int**, malloc... tu es sur que c'est du C++ que tu veux faire et pas du C

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    je suis pas tres bon en C++.
    ca donnerait quoi une déclaration de matrice sans malloc ?

    je vois pas comment faire avec du 'new'

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    j'aurais appris un nouveua truc aujourd'hui en C++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int **mat;
    int L = 5;
    int C = 7;
    mat = new int*[L];
    for(int i=0;i<L;i++)
    {
        mat[i] = new int[C];
    }
    Ca a l'aire de fonctionner.

    Mais pour mon problème, tu as une idée pour mettre ca dans un vecteur ?

  5. #5
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Juste comme ça, indépendamment de la question C ou C++, pourquoi n'alloues-tu pas un tableau de height * width int (plutôt qu'un tableau de pointeurs vers des tableaux d'int) ?

    Voici un petit exemple de code avec new :
    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
    typedef int pixel ; // plus lisible et plus facile à faire évoluer
     
    void treat_pixel ( pixel & p )
        {
        p = 123 ;
        }
     
    void foo ( int height , int width )
        {
        pixel * image = new pixel [height*width] ;
     
        for ( int y = 0 ; y < height ; ++y )
            for ( int x = 0 ; x < width ; ++x )
                treat_pixel( image[y*width+x] ) ;
        }
    Mais attention, on est encore loin du c++ élégant utilisant la stl...
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven x64 & Win 10 / Visual 2017 / Python 2.7 / Eclipse

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Ok,


    Et si je veux stocker cette matrice comme tu me proposes pour chaque image que j'ai.

    Je présente mieux la situation. je suis sous QtCreator avec un mainwindow.h
    je voudrais y déclarer le vector, ou autre qui contiendra toutes mes matrices.

    et dans le mainwindow.cpp, lors de l'appel d'un slot, d'une fontion; je l'initialise.

    Ca se présente comment ?

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    je suis pas tres bon en C++
    Donc fais au plus simple.

    Ca a l'aire de fonctionner
    L'expression exacte est : "ça tombe en marche"...


    Pour le problème des conteneur en 2D, c'est un problème régulièrement abordé sur le forum, un petite recherche pourra t'aider. Pour résumer, l'idée est d'utiliser un vector simple de taille width*height et d'accéder aux éléments avec () :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T& operator() (int i, int j) { return elems[i+j*width]; }
    (remarque : après relecture, c'est la solution que tu proposes presque Captain'Flam, mais en utilisant vector)

    Si tu débutes en C++, prend comme règle de base : "interdiction d'utiliser malloc, free et new[]". Tu verras plus tard quand enfreindre ces règles.

    Tu peux regarder par exemple la classe DynamicArray2D de QExtend (je viens de faire le commit pour te montrer l'idée général, le code, n'est pas encore validé, ne fait pas un copié-collé)

    Au finale, ton code doit se structurer de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MatriceAlloueeDynamiquement 
    {
       int width;
       int height;
       std::vector<int> elems; // tu peux aussi mettre int en paramètre template
    };
     
    class MonConteneurDImage 
    { 
       std::vector<MatriceAlloueeDynamiquement> elems; 
    };

    Autre question : si tu utilises Qt, pourquoi ne pas utiliser QImage ? (ou QPixmap ou autre)

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    En effet, les images chargées sont converties en Qimage.

    Mais le traitement que je souhaite effectuer me semble plus pratique sur des tableau de int.

    je vous remercie pour vos réponses.


    Un point sur la façon de déclarer la matrice dynamiquement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int **data;
    data = new int*[hauteur];
        for (int i = 0; i < hauteur; ++i)
            data[i] = new int[largeur];
    Ce n'est pas une façon correcte de faire ?
    si oui, pourquoi ?

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Ce n'est pas une façon correcte de faire ?
    Non, relis mon message : le mieux est de faire un tableau 1D (avec std::vector) et d'ajouter l'opérateur ()


    PS : en complément, j'ai oublié de signaler qu'il existe aussi boost::multiarray

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    j'ai placé l'opérateur dans le fichier .h de la facon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class MaMatrice
    {
    public:
        MaMatrice(int w, int h);
     
        int &operator () (int y, int x);
     
    //donnees membres
        int w;
        int h;
        std::vector<int> data;
     
    }
    et dans le .cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    MaMatrice::MaMatrice(int h, int w)
    {
        this->hauteur = h;
        this->largeur = w;
     
        this->data.resize(h*w, 0);
    }
     
     
    int &Matrice::operator () (int y, int x)
    {
        return this.data[y*width + x];
    }
    Mais j'ai une erreur :
    ...must be a non-static member function

    Est-ce que quelqu'un sait pourquoi ca ne fonctionne pas ?

  11. #11
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    En mettant en rouge, tu vois le problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MaMatrice::MaMatrice(int h, int w)
    {
        this->hauteur = h;
        this->largeur = w;
     
        this->data.resize(h*w, 0);
    }
     
     
    int &Matrice::operator () (int y, int x)
    {
        return this.data[y*width + x];
    }
    Sinon, pas besoin de this ici, il est implicite

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Effectivement, ca marche mieux. Merci

    j'utilise cette facon de faire pour reserver la place du vecteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data.resize(h*w, 0);
    Est ce la bonne facon de faire ?

  13. #13
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Est ce la bonne facon de faire ?
    Je n'avais rien dit donc oui. L'opérateur [] ne redimensionne pas le vecteur et nécessite que l'indice soit valide donc il faut redimensionner le vecteur dans le constructeur (ou la fonction si tu l'ajoutes)

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

Discussions similaires

  1. [Débutant] Ecriture dune matrice avec 2 colonnes dans un vecteur colonne
    Par abel413 dans le forum MATLAB
    Réponses: 12
    Dernier message: 27/06/2013, 10h35
  2. [Débutant] afficher les valeurs d'une matrice dans un vecteur ?
    Par Imène_23 dans le forum MATLAB
    Réponses: 3
    Dernier message: 21/08/2011, 12h39
  3. Stockage diagonale de matrice dans un vecteur
    Par ClaireA dans le forum Fortran
    Réponses: 8
    Dernier message: 18/11/2009, 14h16
  4. Réponses: 12
    Dernier message: 17/05/2009, 15h21
  5. Réponses: 14
    Dernier message: 28/07/2006, 10h20

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