00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkMembershipSample_h
00018
#define __itkMembershipSample_h
00019
00020
#include "itk_hash_map.h"
00021
#include "itkSample.h"
00022
#include "itkSubsample.h"
00023
00024
#include "itkExceptionObject.h"
00025
00026
namespace itk{
00027
namespace Statistics{
00028
00050
template<
class TSample >
00051 class ITK_EXPORT MembershipSample :
00052
public Sample< typename TSample::MeasurementVectorType >
00053 {
00054
public:
00056 typedef MembershipSample
Self;
00057 typedef Sample< typename TSample::MeasurementVectorType > Superclass ;
00058 typedef SmartPointer< Self > Pointer ;
00059
00061
itkTypeMacro(MembershipSample,
Sample);
00062
itkNewMacro(
Self) ;
00063
00066
typedef typename TSample::MeasurementVectorType
MeasurementVectorType;
00067 typedef typename TSample::MeasurementType
MeasurementType;
00068 typedef typename TSample::InstanceIdentifier
InstanceIdentifier;
00069 typedef typename TSample::FrequencyType
FrequencyType ;
00070
00071
00072
00074
itkStaticConstMacro(MeasurementVectorSize,
unsigned int,
00075 TSample::MeasurementVectorSize);
00076
00079
typedef std::vector< unsigned int >
UniqueClassLabelsType ;
00080
00083
typedef itk::hash_map< InstanceIdentifier, unsigned int> ClassLabelHolderType ;
00084
00087
typedef Subsample< TSample > ClassSampleType ;
00088
00090
void SetSample(TSample* sample) ;
00091
00093 TSample* GetSample() ;
00094
00096
void SetNumberOfClasses(
unsigned int numberOfClasses) ;
00097
00099
unsigned int GetNumberOfClasses() const ;
00100
00105
void AddInstance(const
unsigned int &classLabel, const
InstanceIdentifier &
id) ;
00108
unsigned int GetClassLabel(const
InstanceIdentifier &
id) const ;
00109
00112
int GetInternalClassLabel(const
unsigned int classLabel ) const ;
00113
00116
unsigned int GetClassSampleSize(const
unsigned int &classLabel) const ;
00117
00120
ClassSampleType* GetClassSample(const
unsigned int &classLabel) ;
00121
00124
ClassLabelHolderType* GetClassLabels()
00125 {
return &m_ClassLabelHolder ; }
00126
00128
unsigned int Size(
void) const ;
00129
00132
MeasurementVectorType GetMeasurementVector(const
InstanceIdentifier &
id) ;
00133
00136
MeasurementType GetMeasurement(const
InstanceIdentifier &
id,
00137 const
unsigned int &dimension) ;
00138
00140
FrequencyType GetFrequency(const
InstanceIdentifier &
id) const ;
00141
00143
FrequencyType GetTotalFrequency() const ;
00144
00145
void Resize(
unsigned int n)
00146 {
00147 m_ClassLabelHolder.resize(n) ;
00148 }
00149
00150
class Iterator;
00151
friend class Iterator;
00152
00153 Iterator Begin()
00154 {
00155 Iterator iter(0,
this) ;
00156
return iter;
00157 }
00158
00159 Iterator End()
00160 {
00161 Iterator iter(this->Size(),
this) ;
00162
return iter;
00163 }
00164
00165
class Iterator
00166 {
00167 public:
00168
Iterator(
InstanceIdentifier id,
Self* membershipSample)
00169 :m_Id(id), m_MembershipSample(membershipSample),
00170 m_Sample(membershipSample->GetSample())
00171 {}
00172
00173
FrequencyType GetFrequency()
const
00174
{
return m_Sample->GetFrequency(m_Id) ; }
00175
00176
MeasurementVectorType GetMeasurementVector()
00177 {
return m_Sample->GetMeasurementVector(m_Id) ; }
00178
00179
InstanceIdentifier GetInstanceIdentifier()
const
00180
{
return m_Id ; }
00181
00182
void SetClassLabel(
unsigned int classLabel)
00183 { m_MembershipSample->AddInstance(classLabel, m_Id) ; }
00184
00185
unsigned int GetClassLabel()
const
00186
{
return m_MembershipSample->GetClassLabel(m_Id) ; }
00187
00188
Iterator& operator++()
00189 {
00190 ++m_Id ;
00191
return *
this ;
00192 }
00193
00194
bool operator!=(
const Iterator& it)
00195 {
00196 if (m_Id != it.m_Id ||
00197 m_MembershipSample != it.m_MembershipSample ||
00198 m_Sample != it.m_Sample)
00199 {
00200
return true ;
00201 }
00202
else
00203 {
00204
return false ;
00205 }
00206 }
00207
00208
bool operator==(
const Iterator& it)
00209 {
00210 if (m_Id == it.m_Id &&
00211 m_MembershipSample == it.m_MembershipSample &&
00212 m_Sample == it.m_Sample)
00213 {
00214
return true ;
00215 }
00216
else
00217 {
00218
return false ;
00219 }
00220 }
00221
00222 Iterator& operator=(
const Iterator& it)
00223 {
00224 m_Id = it.m_Id;
00225 m_MembershipSample = it.m_MembershipSample ;
00226 m_Sample = it.m_Sample ;
00227
return *
this ;
00228 }
00229
00230
Iterator(
const Iterator& it)
00231 {
00232 m_Id = it.m_Id;
00233 m_MembershipSample = it.m_MembershipSample ;
00234 m_Sample = it.m_Sample ;
00235 }
00236
00237
private:
00238
00239
InstanceIdentifier m_Id ;
00240
00241
Self* m_MembershipSample ;
00242 TSample* m_Sample ;
00243 } ;
00244
00245
protected:
00246 MembershipSample() ;
00247
virtual ~MembershipSample() {}
00248
void PrintSelf(std::ostream& os,
Indent indent)
const;
00249
00250
private:
00251 MembershipSample(
const Self&) ;
00252
void operator=(
const Self&) ;
00253
00254 TSample* m_Sample ;
00255
unsigned int m_CurrentClassLabel ;
00256
UniqueClassLabelsType m_UniqueClassLabels ;
00257
ClassLabelHolderType m_ClassLabelHolder ;
00258
unsigned int m_NumberOfClasses ;
00259 std::vector< unsigned int > m_ClassSampleSizes ;
00260 std::vector< typename ClassSampleType::Pointer > m_ClassSamples ;
00261 } ;
00262
00263
00264 }
00265 }
00266
00267
00268
#ifndef ITK_MANUAL_INSTANTIATION
00269
#include "itkMembershipSample.txx"
00270
#endif
00271
00272
#endif
00273
00274
00275
00276
00277
00278
00279