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
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
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 }
00153
00154 }
00155
00156
00157
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 }
00203
00204 }
00205
00206 #endif