randomSampleSelector.h

Go to the documentation of this file.
00001 
00016 #ifndef DLR_COMPUTERVISION_RANDOMSAMPLESELECTOR_H
00017 #define DLR_COMPUTERVISION_RANDOMSAMPLESELECTOR_H
00018 
00019 #include <vector>
00020 #include <dlrRandom/pseudoRandom.h>
00021 
00022 namespace dlr {
00023 
00024   namespace computerVision {
00025 
00035     template <class Sample>
00036     class RandomSampleSelector {
00037     public:
00038 
00039       // ========= Public typedefs. =========
00040 
00044       typedef Sample SampleType;
00045 
00051       typedef std::pair<typename std::vector<SampleType>::const_iterator,
00052                         typename std::vector<SampleType>::const_iterator>
00053         SampleSequenceType;
00054 
00055 
00056       // ========= Public member functions. =========
00057 
00068       template <class IterType>
00069       RandomSampleSelector(IterType beginIter, IterType endIter)
00070         : m_sampleVector(beginIter, endIter) {}
00071 
00072 
00082       SampleSequenceType
00083       getPool() {
00084         return std::make_pair(m_sampleVector.begin(), m_sampleVector.end());
00085       }
00086 
00087 
00095       size_t
00096       getPoolSize() {return m_sampleVector.size();}
00097 
00098 
00111       SampleSequenceType
00112       getRandomSample(size_t sampleSize);
00113 
00114 
00141       template<class IterType>
00142       SampleSequenceType
00143       getSubset(IterType beginIter, IterType endIter);
00144       
00145     private:
00146       
00147       dlr::random::PseudoRandom m_pseudoRandom;
00148       std::vector<SampleType> m_sampleVector;
00149 
00150     };
00151 
00152   } // namespace computerVision
00153   
00154 } // namespace dlr
00155 
00156 
00157 /* ============ Definitions of inline & template functions ============ */
00158 
00159 
00160 namespace dlr {
00161 
00162   namespace computerVision {
00163 
00164     template <class Sample>
00165     typename RandomSampleSelector<Sample>::SampleSequenceType
00166     RandomSampleSelector<Sample>::
00167     getRandomSample(size_t sampleSize)
00168     {
00169       for(size_t ii = 0; ii < sampleSize; ++ii) {
00170         int jj = m_pseudoRandom.uniformInt(ii, m_sampleVector.size());
00171         std::swap(m_sampleVector[ii], m_sampleVector[jj]);
00172       }
00173       return std::make_pair(
00174         m_sampleVector.begin(), m_sampleVector.begin() + sampleSize);
00175     }
00176 
00177     
00178     template <class Sample>
00179     template<class IterType>
00180     typename RandomSampleSelector<Sample>::SampleSequenceType
00181     RandomSampleSelector<Sample>::
00182     getSubset(IterType beginIter, IterType endIter)
00183     {
00184       typedef typename std::vector<SampleType>::iterator SampleIter;
00185 
00186       SampleIter poolIter = m_sampleVector.begin();
00187       SampleIter candidateIter = m_sampleVector.begin();
00188       while(beginIter != endIter && candidateIter != m_sampleVector.end()) {
00189         if(*beginIter) {
00190           if(candidateIter != poolIter) {
00191             std::swap(*poolIter, *candidateIter);
00192           }
00193           ++poolIter;
00194         }
00195         ++beginIter;
00196         ++candidateIter;
00197       }
00198       return std::make_pair(m_sampleVector.begin(), poolIter);
00199     }
00200 
00201     
00202   } // namespace computerVision
00203   
00204 } // namespace dlr
00205 
00206 #endif /* #ifndef DLR_COMPUTERVISION_RANDOMSAMPLESELECTOR_H */

Generated on Wed Nov 25 12:15:05 2009 for dlrComputerVision Utility Library by  doxygen 1.5.8