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
00027 template< class TSample >
00028 class ITK_EXPORT Subsample :
00029 public Sample< typename TSample::MeasurementVectorType >
00030 {
00031 public:
00033 typedef Subsample Self;
00034 typedef Sample< typename TSample::MeasurementVectorType > Superclass ;
00035 typedef SmartPointer< Self > Pointer ;
00036
00038 itkTypeMacro(Subsample, Sample);
00039
00041 itkNewMacro(Self) ;
00042
00044 typedef typename TSample::Pointer SamplePointer ;
00045
00048 typedef typename TSample::MeasurementVectorType MeasurementVectorType;
00049 typedef typename TSample::MeasurementType MeasurementType;
00050 typedef typename TSample::InstanceIdentifier InstanceIdentifier;
00051 typedef typename TSample::FrequencyType FrequencyType ;
00052 typedef MeasurementVectorType ValueType ;
00053
00055 itkStaticConstMacro(MeasurementVectorSize, unsigned int,
00056 TSample::MeasurementVectorSize);
00057
00062 typedef std::vector< InstanceIdentifier > InstanceIdentifierHolder ;
00063
00065 void SetSample(TSample* sample)
00066 { m_Sample = sample ; }
00067
00068 TSample* GetSample()
00069 { return m_Sample ; }
00070
00071 void InitializeWithAllInstances()
00072 {
00073 m_IdHolder.resize(m_Sample->Size()) ;
00074 typename InstanceIdentifierHolder::iterator idIter = m_IdHolder.begin() ;
00075 typename TSample::Iterator iter = m_Sample->Begin() ;
00076 typename TSample::Iterator last = m_Sample->End() ;
00077 m_TotalFrequency = NumericTraits< FrequencyType >::Zero ;
00078 while (iter != last)
00079 {
00080 *idIter++ = iter.GetInstanceIdentifier() ;
00081 m_TotalFrequency += iter.GetFrequency() ;
00082 ++iter ;
00083 }
00084 }
00085
00086 void AddInstance(InstanceIdentifier id)
00087 {
00088 m_IdHolder.push_back(id) ;
00089 m_TotalFrequency += m_Sample->GetFrequency(id) ;
00090 }
00091
00094 unsigned int Size() const
00095 {
00096 return static_cast<unsigned int>( m_IdHolder.size() );
00097 }
00098
00099 void Clear()
00100 {
00101 m_IdHolder.clear() ;
00102 m_TotalFrequency = NumericTraits< FrequencyType >::Zero ;
00103 }
00104
00107 MeasurementVectorType GetMeasurementVector(const InstanceIdentifier &id)
00108 { return m_Sample->GetMeasurementVector(id) ; }
00109
00111 FrequencyType GetFrequency(const InstanceIdentifier &id) const
00112 { return m_Sample->GetFrequency(id) ; }
00113
00115 FrequencyType GetTotalFrequency() const
00116 { return m_TotalFrequency ; }
00117
00118 void Swap(int index1, int index2) ;
00119
00120 MeasurementVectorType GetMeasurementVectorByIndex(int index) ;
00121
00122 FrequencyType GetFrequencyByIndex(int index) ;
00123
00124 InstanceIdentifier GetInstanceIdentifier(int index) ;
00125
00126 class Iterator;
00127 friend class Iterator;
00128
00129 Iterator Begin()
00130 {
00131 Iterator iter(m_IdHolder.begin(), this) ;
00132 return iter;
00133 }
00134
00135 Iterator End()
00136 {
00137 Iterator iter(m_IdHolder.end(), this) ;
00138 return iter;
00139 }
00140
00141 class Iterator
00142 {
00143 public:
00144 Iterator(typename InstanceIdentifierHolder::iterator iter,
00145 Self* classSample)
00146 :m_Iter(iter), m_Subsample(classSample),
00147 m_Sample(classSample->GetSample())
00148 {}
00149
00150 FrequencyType GetFrequency() const
00151 { return m_Sample->GetFrequency(*m_Iter) ; }
00152
00153 MeasurementVectorType GetMeasurementVector()
00154 { return m_Sample->GetMeasurementVector(*m_Iter) ; }
00155
00156 InstanceIdentifier GetInstanceIdentifier() const
00157 { return *m_Iter ; }
00158
00159 Iterator& operator++()
00160 {
00161 ++m_Iter ;
00162 return *this ;
00163 }
00164
00165 Iterator& operator+()
00166 { m_Iter += n; return *this ;}
00167
00168 Iterator& operator+(int n)
00169 { m_Iter += n; return *this ;}
00170
00171 Iterator& operator-(int n)
00172 { m_Iter -= n; return *this ;}
00173
00174 bool operator!=(const Iterator& it)
00175 { return (m_Iter != it.m_Iter) ; }
00176
00177 bool operator==(const Iterator& it)
00178 { return (m_Iter == it.m_Iter) ; }
00179
00180 Iterator& operator=(const Iterator& iter)
00181 {
00182 m_Iter = iter.m_Iter;
00183 m_Subsample = iter.m_Subsample ;
00184 m_Sample = iter.m_Sample ;
00185 return *this ;
00186 }
00187
00188 Iterator(const Iterator& iter)
00189 {
00190 m_Iter = iter.m_Iter;
00191 m_Subsample = iter.m_Subsample ;
00192 m_Sample = iter.m_Sample ;
00193 }
00194
00195 private:
00196
00197 typename InstanceIdentifierHolder::iterator m_Iter ;
00198
00199 Self* m_Subsample ;
00200 TSample* m_Sample ;
00201 } ;
00202
00203 protected:
00204 Subsample() ;
00205 virtual ~Subsample() {}
00206 void PrintSelf(std::ostream& os, Indent indent) const;
00207
00208 private:
00209 Subsample(const Self&) ;
00210 void operator=(const Self&) ;
00211
00212 TSample* m_Sample ;
00213 InstanceIdentifierHolder m_IdHolder ;
00214 unsigned int m_ActiveDimension ;
00215 FrequencyType m_TotalFrequency ;
00216 } ;
00217
00218
00219 }
00220 }
00221
00222
00223 #ifndef ITK_MANUAL_INSTANTIATION
00224 #include "itkSubsample.txx"
00225 #endif
00226
00227 #endif
00228
00229
00230
00231
00232
00233
00234