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

SL & STL C++ Discussion :

problème de comparaison de vectors


Sujet :

SL & STL C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut problème de comparaison de vectors
    Bonjour à tous. je vous expose mon problème qui me tracasse en ce moment:

    En fait j'ai à la base 3 csv qui stockent des coordonnées de points en x et y et leur niveau de gris correspondant. en gros ca donne ca

    cordx cordy niveau gris
    50 150 3810

    Je lis mes 3 csv et stocke les valeurs dans un vector par csv (donc un vector 3d qui stocke en colonne 0 la valeur en x, en colonne 1 la valeur en y et en colonne 2 la valeur de niveau de gris.

    Ce que je voudrais arriver à faire, c'est trouver les points communs aux 3 csv et les stocker dans un vector résultat avec les 3 niveaux de gris correspondant. En fait j'ai 3 coupes d'images et je dois récupérer les points communs au 3 pour avoir les niveaux de gris dans les 3 dimensions.

    Je rajoute à mon explication que les vectors n'ont pas la même taille (ils peuvent l'avoir mais ca veut dire que l'utilisateur qui a tracé la coupe sur l'image a fait 3 fois le même tracé donc il est très fort ). Voilà si quelqu'un a une idée je suis preneur car là je sèche totalement.

    Merci d'avance à tous ceux qui pourront m'aider

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

    La première chose à faire, c'est de rendre les images comparables, c'est à dire de les mettres toutes à la même taille.

    Une fois que toutes les images sont à la même taille, il devient facile de les parcourir de manière uniforme pour les comparer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(int i; i < width; ++i){
       for(int j = 0; j < height; ++j){
          // cas vector 2d
          if((vvImage1[x][y] == vvImage2[x][y]) &&
             (vvImage1[x][y] == vvImage3[x][y])) {
             // Stoker la valeur dans la nouvelle image
          }
       }
    }
    En fait j'ai 3 coupes d'images et je dois récupérer les points communs au 3 pour avoir les niveaux de gris dans les 3 dimensions.
    Un tour sur le forum traitement d'images serai à mon avis la première chose à faire avant de passer à l'implémentation.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Je ne sais pas si ça peut t'aider, mais en standard tu as des fonctions comme std::set_intersection (aussi std::set_union, std::set_difference ) qui te permettent de récupérer les points communs (ou les différences ) entre deux containers triés ( à ne pas oublier ) mais de tailles différentes.

    Tu peux faire quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::vector< TaClasse > v1, v2, results;
     
    std::set_difference( v1.begin(), v1.end(),
                         v2.begin(), v2.end(),
                         std::back_inserter( results ) );
    Il faut que ta classe puisse être comparable ( avec un operateur < ou autre fonction à donner comme dernier paramètre à set_difference )

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    Merci de ta réponse. En fait ce matin j'ai eu une idée, au lieu d'avoir un vector < vector <int> > j'ai stocké mes points sous forme de CPoint (classe de la mfc qui en gros récupère la valeur en x et y et en fait un point en mémoire).

    Du coup je me retrouve avec cette structure:

    vector

    CPoint(x;y)
    CPoint(x;y)
    CPoint(x;y)
    CPoint(x;y)
    ...
    ...
    ...

    Je pense que la comparaison sera plus simple là? A partir de ces poins je peux faire un multimap et comparer les clés? Le problème c'est que les points identiques sont pas forcément au même endroit dans le tableau d'où la difficulté de la comparaison en fait.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Je pense que la comparaison sera plus simple là? A partir de ces poins je peux faire un multimap et comparer les clés? Le problème c'est que les points identiques sont pas forcément au même endroit dans le tableau d'où la difficulté de la comparaison en fait.
    tu peux toujours utiliser set_differencet, set_ etc... pour avoir tes résultats.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    ok donc la fonction intersection va m'être utile, maintenant le soucis est la surcharge de < qui m'est demandée. Comment surcharger une classe des MFC? je peux directement le faire comme ca où je veux? Je suis pas sûr quelles merdes ces mfc...

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par joesatriani Voir le message
    ok donc la fonction intersection va m'être utile, maintenant le soucis est la surcharge de < qui m'est demandée. Comment surcharger une classe des MFC? je peux directement le faire comme ca où je veux? Je suis pas sûr quelles merdes ces mfc...
    Peut-être qu'elle existe déjà?

    Si tu peux le mettre dans un container trié, il y a des chances qu'elle existe non?

    Sinon tu peux créer ta fonction de comparaison où tu veux oui ( et pas forcément un operator< en utilisant les versions des fonctions/containers qui s'appellent avec une fonction de comparaison en plus )

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    En fait mes points sont triés car les csv sont triés et vu que je remplis mes vectors à partir de ces csv j'ai donc des vectors triés. Le soucis c'est qu'à la compilation il me dit:

    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\algorithm(2384): error C2678: '<' binaire : aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'std::allocator<_Ty>::value_type' (ou il n'existe pas de conversion acceptable)
    with
    [
    _Ty=CPoint
    ]
    donc j'en déduis qu'il veut la surcharge de '<' de la classe CPoint nan?

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par joesatriani Voir le message
    En fait mes points sont triés car les csv sont triés et vu que je remplis mes vectors à partir de ces csv j'ai donc des vectors triés. Le soucis c'est qu'à la compilation il me dit:

    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\algorithm(2384): error C2678: '<' binaire : aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'std::allocator<_Ty>::value_type' (ou il n'existe pas de conversion acceptable)
    with
    [
    _Ty=CPoint
    ]
    donc j'en déduis qu'il veut la surcharge de '<' de la classe CPoint nan?
    oui tu peux créer un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bool operator<( const CPoint & p1, const CPoint & p2 )
    {
    }
    à un endroit approprié.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    ouaip j'y avais pensé par contre l'autre soucis c'est que dans mon appel de fonction:

    set_intersection(X.begin(),X.end(), Y.begin(), Y.end(), results);

    je n'ai pas vraiment de points à donner en paramètre à donner à l'opérateur

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    bon la surcharge a marché mais j'ai encore une erreur ...lol:

    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\algorithm(2389): error C2676: '++' : 'std::vector<_Ty>' binaire ne définit pas cet opérateur ou une conversion vers un type acceptable pour l'opérateur prédéfini
    with
    [
    _Ty=CPoint
    ]

    j'avoue que celle-ci me laisse pantois j'avoue ne pas comprendre pourquoi il veut un opérateur ++ sur mes CPoint... lol


    EDIT: oups je crois que c'est parce que j'ai oublié ca std::back_inserter

    je teste ca en revenant au bureau staprem et si ca plante encore je reviendrai par ici ;D en tout cas merci beaucoup pour votre aide

  12. #12
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 297
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    si tu as des soucis avec les set_xxx, tu peux jeter un coup d'oeil ici

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    yes merci bien à tous vous m'enlevez une sacrée épine du pied ca va me permettre de finir mon stage tranquilou en rendant quelque chose qui marche je teste tout ca à 14h et je vous tiens au jus

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    A priori ca marche donc je finis mes tests et si j'ai un problème je sais où venir. merci beaucoup

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    Effectivement ca a bien marché merci beaucoup. J'ai un bug marant à vous faire partager. J'ai stocké dans un vector <vector <int> > des points avec leur niveau de gris

    X Y nvg1 nvg2 nvg3
    .
    .
    .
    .
    .
    .
    nbpoints

    donc dans mon tableau tout va bien si je demande d'afficher dans une messagebox la valeur de mes niveaux de gris dans une boucle ca s'affiche nickel. Par contre quand je demande d'écrire cette même valeur dans un fichier, j'ai toujours la meme valeur de niveau de gris qui s'écrit (la première en l'occurrence). J'avouerai que là, je ne comprends pas d'où vient le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (int i = 0; i< ecx.size(); i++)
    {
     nvg = ecx[i][2];
     
    // si je demande d'afficher les valeurs, j'ai bien les bonnes valeurs ici.
     
     ficres<<nvg;// alors qu'ici dans le fichier j'ai toujours la même qui s'écrit.
     
    }
    si vous avez une idée je suis preneur car là j'avoue que je comprends pas du tout ce qui se passe.

    EDIT: j'ai encore plus drôle:

    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
    for (int i = 0; i< ecx.size(); i++)
    {
      int test  = ecx[i][2];
      int test1 = ecx[i][3];
      int test2 = ecx[i][4];
    			if (i == ecx.size()-2)
    			{
      				char c[10];
    				itoa(test,c,10);
    				CString MFCString;
    				MFCString = c;
    				AfxMessageBox(MFCString);
    				itoa(test2,c,10);
    								MFCString = c;
    				AfxMessageBox(MFCString);
    								itoa(test3,c,10);
    								MFCString = c;
    				AfxMessageBox(MFCString);
    			}
     
      ficres<<ecx[i][2]<<";"<<ecx[i][3]<<";"<<ecx[i][4]<<";"<<"\n";
     
    }
    et bein devinez quoi? avec ce code là, ca m'écrit les bonnes valeurs dans le fichier.... je pige rien du tout sur ce coup là lol

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    bon finalement je vais utiliser une autre méthode. Je vous explique le topo:

    J'ai 3 map <CPoint,int>. Dans celles ci, j'ai mes points en clés et à chaque point j'attribue un niveau de gris. Jusque là ca va. Ce que je voudrais faire, c'est avoir les points en commun des 3 map. Avec set_intersection, a priori c'est impossible donc si quelqu'un avait une idée, je suis preneur parce que là je bloque dessus depuis 2 jours et je dors pas beaucoup à me creuser la tête sur ce bug

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    un bug? non. Impossible? c'est toi qui le dis

  18. #18
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 297
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par joesatriani Voir le message
    Ce que je voudrais faire, c'est avoir les points en commun des 3 map.
    set_union() ?

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    le problème si je fais set_union ca va me retourner l'union des map et non l'intersection ?

    En fait j'ai trouvé une idée qui me parait bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (it = Xm.begin(); it!=Xm.end(); it++)
    {
    	pair<CPoint,int> t;
    	if (Ym.find((*it).first) != NULL)
    	{	
    		if (Zm.find((*it).first) != NULL)
    		{
    		t.first = (*it).first;
    		t.second = 0;
    		res.insert(t);
    		}
    	}
    }
    malheureusement ca me donne rien de bien bon , en gros ca me retourne ce que j'ai dans Xm ce qui n'est pas logique du tout aux vues du code.

  20. #20
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 297
    Billets dans le blog
    2
    Par défaut
    oui oops pardon, pas réveillé

    Pourquoi set_intersection ne te conviens pas?

Discussions similaires

  1. [Collections] Comparaison de vector sur plusieurs critères
    Par Alexr dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 10/03/2006, 17h26
  2. problème de comparaison table dans requète.
    Par Sendo dans le forum Access
    Réponses: 8
    Dernier message: 09/03/2006, 11h10
  3. Problème de comparaison (chez lycos)
    Par Tuscelan dans le forum Langage
    Réponses: 4
    Dernier message: 10/11/2005, 18h13
  4. Problème d'utilisation de vector
    Par loupdeau dans le forum SL & STL
    Réponses: 12
    Dernier message: 28/02/2005, 12h05
  5. Problème de comparaison de dates
    Par MiJack dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/03/2004, 21h43

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