Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

itkSubsample.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Insight Segmentation & Registration Toolkit
00004   Module:    $RCSfile: itkSubsample.h,v $
00005   Language:  C++
00006   Date:      $Date: 2005/07/26 15:55:06 $
00007   Version:   $Revision: 1.28 $
00008 
00009   Copyright (c) Insight Software Consortium. All rights reserved.
00010   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even 
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00014      PURPOSE.  See the above copyright notices for more information.
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     //Iterator& operator+()
00164     //{ m_Iter += n; return *this ;}
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     // Iterator pointing to ImageToListAdaptor
00195     typename InstanceIdentifierHolder::iterator m_Iter ;  
00196     // Pointer to Subsample object
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     //ConstIterator& operator+()
00228     //{ m_Iter += n; return *this ;}
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     // ConstIterator pointing to ImageToListAdaptor
00259     typename InstanceIdentifierHolder::const_iterator m_Iter ;  
00260     // Pointer to Subsample object
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&) ; //purposely not implemented
00298   void operator=(const Self&) ; //purposely not implemented
00299 
00300   const TSample*              m_Sample ;
00301   InstanceIdentifierHolder    m_IdHolder ;
00302   unsigned int                m_ActiveDimension ;
00303   FrequencyType m_TotalFrequency ;
00304 } ; // end of class
00305 
00306 
00307 } // end of namespace Statistics 
00308 } // end of namespace itk
00309 
00310 
00311 #ifndef ITK_MANUAL_INSTANTIATION
00312 #include "itkSubsample.txx"
00313 #endif
00314 
00315 #endif
00316 
00317 
00318 
00319 
00320 
00321 
00322 

Generated at Tue Aug 30 16:46:29 2005 for ITK by doxygen 1.4.1 written by Dimitri van Heesch, © 1997-2000