Bonjour,
Bon voila j'ai un probleme au niveau des sorts en C++, et je me pose plusieurs questions.
Pour résumer l'idée: J'ai une image, et une liste de petit patch 20x20 pixels a differentes positions sur cette images.
chaque patch à :
mon but etant donc de tester environ 500 patchs aléatoirements et de les trier selon leur entropy pour recuperer les 50 meilleurs.
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 class MptIIMPatch { private: uint32 _x,_y; //Coordonées du patch sur l'image int _nof_histo; double _entropy; //Entropy de l'histogram du patch public: uint32 *histo; //Tableaux representant un histogram a 16 niveaux uint32 mean,var; //moyenne et variance du patch sur l'image. // Constructor Destructeur etc.. ... };
Alors comme je commence le c++ j'essaye d'utiliser au plus les library.
Idée 1:
Remplir un vecteur avec chaque entropy, remplir un autre avec des index de 0 à 499, et faire un sort sur l'entropy et de swaper l'index simultanéments. (Pour ceux qui utilise matlab je pense que vous avez déjà testé cette fonction)
Le but etant donc d'avoir un tableaux avec l'entropie ordonnée mais aussi un autre avec l'ancien index de l'entropie avant le sort. ainsi je prend les 50 premiers index et retrouve les 50 meilleurs patchs.
J'ai cherché un peu dans la stl mais j'ai rien trouvé qui puisse faire ca.
Idée 2:
utiliser le custom sort du FAQ. : http://c.developpez.com/faq/cpp/?pag...TL_custom_sort
Malheureusement ca marche pas avec ma class
Voila ce que j'ai fait (dans une classe contenant plusieurs object dont un vecteur de MptIIMPatch;
Bon ma premiere erreur sont les const qui ne marche pas mais meme si je les enleves j'ai bcp d'erreur provenant de la stl
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 /* in MptLayIIM.hpp */ #include <vector> #include <algorithm> #include "MptIIMPatch" class MptLayIIM { private: ... std::vector<MptIIMPatch> _patchVec; public: ... }; /* in MptLayIIM.cpp */ struct SortByEntropy { bool operator ()(const MptIIMPatch & p1,const MptIIMPatch & p2 ) const { return p1.getEntropy() < p2.getEntropy(); } }; void MptLayIIM::getGoodPatches(int nof_patch) { //Check Vector size if(_patchVec.size() != nof_selected) _patchVec.resize(nof_patch); //Build new random coordinate value this->setRandPatchesCoord(nof_patch); //Get Patches Values for testing this->getPatchesValues(nof_patch); for(int i(0);i<N_PTEST;++i) { _patchVec[i].setEntropy(); } std::sort(_patchVec.begin(),_patchVec.end(), SortByEntropy()); }
Ex:/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h: In function «const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&, _Compare) [with _Tp = MptIIMPatch, _Compare = SortByEntropy]»:
De plus je me demandais comment fonctionnait ce sort,
si il copiait les pointeurs sur les objets (ou leur references) sans copié lchaques champs ou il fait une copie de chaque champs (dans ce cas que ce passe t'il avec uint32 histo[].
PS: Je me souviens d'avoir utiliser une fois en C un sort qui n'est pas complet... c.a.d je sort les 50 premiers et le reste ca m'est égal. si vous vous souvener du nom ca m'interesse.
Merci d'avance !!!
Partager