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