00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkSubsample_h
00018 #define __itkSubsample_h
00019
00020 #include "itkSample.h"
00021 #include "itkMacro.h"
00022 #include "itkObjectFactory.h"
00023
00024 namespace itk{
00025 namespace Statistics{
00026
00037 template< class TSample >
00038 class ITK_EXPORT Subsample :
00039 public Sample< typename TSample::MeasurementVectorType >
00040 {
00041 public:
00043 typedef Subsample Self;
00044 typedef Sample< typename TSample::MeasurementVectorType > Superclass ;
00045 typedef SmartPointer< Self > Pointer ;
00046 typedef SmartPointer<const Self> ConstPointer;
00047
00049 itkTypeMacro(Subsample, Sample);
00050
00052 itkNewMacro(Self) ;
00053
00055 typedef typename TSample::Pointer SamplePointer ;
00056
00059 typedef typename TSample::MeasurementVectorType MeasurementVectorType;
00060 typedef typename TSample::MeasurementType MeasurementType;
00061 typedef typename TSample::InstanceIdentifier InstanceIdentifier;
00062 typedef typename TSample::FrequencyType FrequencyType ;
00063 typedef MeasurementVectorType ValueType ;
00064
00069 typedef std::vector< InstanceIdentifier > InstanceIdentifierHolder ;
00070
00072 void SetSample(const TSample* sample)
00073 {
00074 m_Sample = sample ;
00075 this->SetMeasurementVectorSize( m_Sample->GetMeasurementVectorSize() );
00076 }
00077
00078 const TSample* GetSample() const
00079 { return m_Sample ; }
00080
00081
00082 void InitializeWithAllInstances()
00083 {
00084 m_IdHolder.resize(m_Sample->Size()) ;
00085 typename InstanceIdentifierHolder::iterator idIter = m_IdHolder.begin() ;
00086 typename TSample::ConstIterator iter = m_Sample->Begin() ;
00087 typename TSample::ConstIterator last = m_Sample->End() ;
00088 m_TotalFrequency = NumericTraits< FrequencyType >::Zero ;
00089 while (iter != last)
00090 {
00091 *idIter++ = iter.GetInstanceIdentifier() ;
00092 m_TotalFrequency += iter.GetFrequency() ;
00093 ++iter ;
00094 }
00095 }
00096
00097 void AddInstance(InstanceIdentifier id)
00098 {
00099 m_IdHolder.push_back(id) ;
00100 m_TotalFrequency += m_Sample->GetFrequency(id) ;
00101 }
00102
00105 unsigned int Size() const
00106 {
00107 return static_cast<unsigned int>( m_IdHolder.size() );
00108 }
00109
00110 void Clear()
00111 {
00112 m_IdHolder.clear() ;
00113 m_TotalFrequency = NumericTraits< FrequencyType >::Zero ;
00114 }
00115
00118 const MeasurementVectorType & GetMeasurementVector(const InstanceIdentifier &id) const
00119 { return m_Sample->GetMeasurementVector(id) ; }
00120
00122 FrequencyType GetFrequency(const InstanceIdentifier &id) const
00123 { return m_Sample->GetFrequency(id) ; }
00124
00126 FrequencyType GetTotalFrequency() const
00127 { return m_TotalFrequency ; }
00128
00129 void Swap(int index1, int index2) ;
00130
00131 MeasurementVectorType GetMeasurementVectorByIndex(int index) const ;
00132
00133 FrequencyType GetFrequencyByIndex(int index) const;
00134
00135 InstanceIdentifier GetInstanceIdentifier(int index) const;
00136
00137
00138
00139 class Iterator
00140 {
00141 public:
00142 Iterator(typename InstanceIdentifierHolder::iterator iter,
00143 Self* classSample)
00144 :m_Iter(iter), m_Subsample(classSample),
00145 m_Sample(classSample->GetSample())
00146 {}
00147
00148 FrequencyType GetFrequency() const
00149 { return m_Sample->GetFrequency(*m_Iter) ; }
00150
00151 const MeasurementVectorType & GetMeasurementVector() const
00152 { return m_Sample->GetMeasurementVector(*m_Iter) ; }
00153
00154 InstanceIdentifier GetInstanceIdentifier() const
00155 { return *m_Iter ; }
00156
00157 Iterator& operator++()
00158 {
00159 ++m_Iter ;
00160 return *this ;
00161 }
00162
00163
00164
00165
00166 Iterator& operator+(int n)
00167 { m_Iter += n; return *this ;}
00168
00169 Iterator& operator-(int n)
00170 { m_Iter -= n; return *this ;}
00171
00172 bool operator!=(const Iterator& it)
00173 { return (m_Iter != it.m_Iter) ; }
00174
00175 bool operator==(const Iterator& it)
00176 { return (m_Iter == it.m_Iter) ; }
00177
00178 Iterator& operator=(const Iterator& iter)
00179 {
00180 m_Iter = iter.m_Iter;
00181 m_Subsample = iter.m_Subsample ;
00182 m_Sample = iter.m_Sample ;
00183 return *this ;
00184 }
00185
00186 Iterator(const Iterator& iter)
00187 {
00188 m_Iter = iter.m_Iter;
00189 m_Subsample = iter.m_Subsample ;
00190 m_Sample = iter.m_Sample ;
00191 }
00192
00193 private:
00194
00195 typename InstanceIdentifierHolder::iterator m_Iter ;
00196
00197 Self* m_Subsample ;
00198 const TSample* m_Sample ;
00199 } ;
00200
00201
00202
00203 class ConstIterator
00204 {
00205 public:
00206 ConstIterator(typename InstanceIdentifierHolder::const_iterator iter,
00207 const Self* classSample)
00208 :m_Iter(iter), m_Subsample(classSample),
00209 m_Sample(classSample->GetSample())
00210 {}
00211
00212 FrequencyType GetFrequency() const
00213 { return m_Sample->GetFrequency(*m_Iter) ; }
00214
00215 const MeasurementVectorType & GetMeasurementVector() const
00216 { return m_Sample->GetMeasurementVector(*m_Iter) ; }
00217
00218 InstanceIdentifier GetInstanceIdentifier() const
00219 { return *m_Iter ; }
00220
00221 ConstIterator& operator++()
00222 {
00223 ++m_Iter ;
00224 return *this ;
00225 }
00226
00227
00228
00229
00230 ConstIterator& operator+(int n)
00231 { m_Iter += n; return *this ;}
00232
00233 ConstIterator& operator-(int n)
00234 { m_Iter -= n; return *this ;}
00235
00236 bool operator!=(const ConstIterator& it)
00237 { return (m_Iter != it.m_Iter) ; }
00238
00239 bool operator==(const ConstIterator& it)
00240 { return (m_Iter == it.m_Iter) ; }
00241
00242 ConstIterator& operator=(const ConstIterator& iter)
00243 {
00244 m_Iter = iter.m_Iter;
00245 m_Subsample = iter.m_Subsample ;
00246 m_Sample = iter.m_Sample ;
00247 return *this ;
00248 }
00249
00250 ConstIterator(const ConstIterator& iter)
00251 {
00252 m_Iter = iter.m_Iter;
00253 m_Subsample = iter.m_Subsample ;
00254 m_Sample = iter.m_Sample ;
00255 }
00256
00257 private:
00258
00259 typename InstanceIdentifierHolder::const_iterator m_Iter ;
00260
00261 const Self* m_Subsample ;
00262 const TSample* m_Sample ;
00263 } ;
00264
00265
00266
00267 Iterator Begin()
00268 {
00269 Iterator iter(m_IdHolder.begin(), this) ;
00270 return iter;
00271 }
00272
00273 Iterator End()
00274 {
00275 Iterator iter(m_IdHolder.end(), this) ;
00276 return iter;
00277 }
00278
00279 ConstIterator Begin() const
00280 {
00281 ConstIterator iter(m_IdHolder.begin(), this) ;
00282 return iter;
00283 }
00284
00285 ConstIterator End() const
00286 {
00287 ConstIterator iter(m_IdHolder.end(), this) ;
00288 return iter;
00289 }
00290
00291 protected:
00292 Subsample() ;
00293 virtual ~Subsample() {}
00294 void PrintSelf(std::ostream& os, Indent indent) const;
00295
00296 private:
00297 Subsample(const Self&) ;
00298 void operator=(const Self&) ;
00299
00300 const TSample* m_Sample ;
00301 InstanceIdentifierHolder m_IdHolder ;
00302 unsigned int m_ActiveDimension ;
00303 FrequencyType m_TotalFrequency ;
00304 } ;
00305
00306
00307 }
00308 }
00309
00310
00311 #ifndef ITK_MANUAL_INSTANTIATION
00312 #include "itkSubsample.txx"
00313 #endif
00314
00315 #endif
00316
00317
00318
00319
00320
00321
00322