17 #ifndef __itkVariableDimensionHistogram_txx
18 #define __itkVariableDimensionHistogram_txx
21 #include "itkNumericTraits.h"
24 namespace Statistics {
26 template<
class TMeasurement,
27 class TFrequencyContainer>
31 m_ClipBinsAtEnds =
true;
32 m_FrequencyContainer = FrequencyContainerType::New();
35 template<
class TMeasurement,
36 class TFrequencyContainer>
40 if( s == this->GetMeasurementVectorSize() )
45 if( (m_OffsetTable.Size() != 0) ||
46 (m_Size.Size() != 0) ||
47 (m_TempIndex.Size() != 0) ||
48 (m_TempMeasurementVector.Size() != 0))
50 itkWarningMacro( <<
"Destructively resizing paramters of the histogram" );
52 Superclass::SetMeasurementVectorSize( s );
53 m_OffsetTable.SetSize( s + 1 );
54 m_OffsetTable.Fill( 0 );
56 m_TempIndex.SetSize( s );
57 m_TempMeasurementVector.SetSize( s );
62 template<
class TMeasurement,
63 class TFrequencyContainer>
68 if( this->GetMeasurementVectorSize() == 0 )
73 unsigned int size = 1;
74 for (
unsigned int i = 0; i < this->GetMeasurementVectorSize(); i++)
81 template<
class TMeasurement,
82 class TFrequencyContainer>
89 "Size mismatch in VariableDimensionHistogram::Initialize(const SizeType &size)");
92 this->SetMeasurementVectorSize( size.
Size() );
101 m_OffsetTable[0] = num;
102 for (
unsigned int i = 0; i < this->GetMeasurementVectorSize(); i++)
105 m_OffsetTable[i + 1] = num;
108 m_NumberOfInstances = num;
112 m_Min.resize(this->GetMeasurementVectorSize());
113 for ( dim = 0; dim < this->GetMeasurementVectorSize(); dim++)
115 m_Min[dim].resize(m_Size[dim]);
118 m_Max.resize(this->GetMeasurementVectorSize());
119 for ( dim = 0; dim < this->GetMeasurementVectorSize(); dim++)
121 m_Max[dim].resize(m_Size[dim]);
125 m_FrequencyContainer->Initialize(m_OffsetTable[ this->GetMeasurementVectorSize() ]);
129 template<
class TMeasurement,
130 class TFrequencyContainer>
135 m_FrequencyContainer->SetToZero();
138 template<
class TMeasurement,
139 class TFrequencyContainer>
145 this->Initialize(size);
150 this->GetMeasurementVectorSize();
152 "Length mismatch: VariableDimensionHistogram::Initialize( , )");
154 "Length mismatch: VariableDimensionHistogram::Initialize( , )");
157 for (
unsigned int i = 0; i < measurementVectorSize; i++)
159 interval = (float) (upperBound[i] - lowerBound[i])
163 for (
unsigned int j = 0; j < static_cast< unsigned int >(size[i] - 1); j++)
166 ((
float)j * interval)));
168 (((
float)j + 1) * interval)));
170 this->SetBinMin(i, size[i] - 1,
172 (((
float) size[i] - 1) * interval)));
173 this->SetBinMax(i, size[i] - 1,
180 template<
class TMeasurement,
181 class TFrequencyContainer>
187 this->GetMeasurementVectorSize();
189 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
191 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
202 for (dim = 0; dim < measurementVectorSize; dim++)
204 tempMeasurement = measurement[dim];
206 if (tempMeasurement < m_Min[dim][begin])
209 index[dim] = (long) m_Size[dim];
213 end = m_Min[dim].size() - 1;
214 if (tempMeasurement >= m_Max[dim][end])
217 index[dim] = (long) m_Size[dim];
222 median = m_Min[dim][mid];
226 if (tempMeasurement < median )
230 else if (tempMeasurement > median)
232 if (tempMeasurement < m_Max[dim][mid])
246 mid = begin + (end - begin) / 2;
247 median = m_Min[dim][mid];
253 template<
class TMeasurement,
254 class TFrequencyContainer>
261 for (
int i = this->GetMeasurementVectorSize() - 1; i > 0; i--)
263 m_TempIndex[i] =
static_cast<IndexValueType>(ident2 / m_OffsetTable[i]);
264 ident2 -= (m_TempIndex[i] * m_OffsetTable[i]);
272 template<
class TMeasurement,
273 class TFrequencyContainer >
280 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
282 for (
unsigned int dim = 0; dim < this->GetMeasurementVectorSize(); dim++)
284 if (index[dim] < 0 || index[dim] >= static_cast<IndexValueType>(m_Size[dim]))
292 template<
class TMeasurement,
293 class TFrequencyContainer >
295 TFrequencyContainer>::InstanceIdentifier
301 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
304 for (
int i= this->GetMeasurementVectorSize() - 1; i > 0; i-- )
306 ident += index[i] * m_OffsetTable[i];
315 template<
class TMeasurement,
316 class TFrequencyContainer >
318 TFrequencyContainer>::MeasurementType&
324 if ( value <= this->m_Min[dimension][0] )
326 return this->m_Min[dimension][0];
331 if ( value >= m_Min[dimension][m_Size[dimension]-1] )
333 return m_Min[dimension][this->m_Size[dimension]-1];
336 for (
int i=0; i < this->m_Size[dimension]; i++ )
338 if ( (value >= this->m_Min[dimension][i])
339 && (value < this->m_Max[dimension][i]) )
341 return this->m_Min[dimension][i];
346 template<
class TMeasurement,
347 class TFrequencyContainer >
349 TFrequencyContainer >::MeasurementType&
355 if ( value <= this->m_Max[dimension][0] )
357 return this->m_Max[dimension][0];
362 if ( value >= m_Max[dimension][m_Size[dimension]-1] )
364 return m_Max[dimension][this->m_Size[dimension]-1];
367 for (
int i = 0; i < this->m_Size[dimension]; i++ )
369 if ( (value >= this->m_Min[dimension][i])
370 && (value < this->m_Max[dimension][i]) )
372 return this->m_Max[dimension][i];
377 template<
class TMeasurement,
378 class TFrequencyContainer >
380 TFrequencyContainer >::MeasurementVectorType&
386 this->GetMeasurementVectorSize();
388 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
390 for (
int i = 0; i < measurementVectorSize; i++ )
392 m_TempMeasurementVector[i] = this->GetDimensionMinByValue(i,measurement[i]);
394 return m_TempMeasurementVector;
397 template<
class TMeasurement,
398 class TFrequencyContainer >
400 TFrequencyContainer >::MeasurementVectorType&
406 this->GetMeasurementVectorSize();
408 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
410 for (
int i=0; i < measurementVectorSize; i++ )
412 m_TempMeasurementVector[i] = this->GetDimensionMaxByValue(i,measurement[i]);
414 return m_TempMeasurementVector;
418 template<
class TMeasurement,
419 class TFrequencyContainer >
421 TFrequencyContainer >::MeasurementVectorType&
427 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
429 for (
int i=0; i < this->GetMeasurementVectorSize(); i++ )
431 m_TempMeasurementVector[i] = this->GetBinMin(i, index[i]);
433 return m_TempMeasurementVector;
436 template<
class TMeasurement,
437 class TFrequencyContainer >
439 TFrequencyContainer >::MeasurementVectorType&
445 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
447 for (
int i=0; i < this->GetMeasurementVectorSize(); i++ )
449 m_TempMeasurementVector[i] = this->GetBinMax(i, index[i]);
451 return m_TempMeasurementVector;
454 template<
class TMeasurement,
455 class TFrequencyContainer >
457 TFrequencyContainer >::MeasurementVectorType &
463 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
465 for (
unsigned int i = 0; i < this->GetMeasurementVectorSize(); i++)
468 m_TempMeasurementVector[i] =
static_cast< MeasurementType >( value / 2.0 );
470 return m_TempMeasurementVector;
473 template<
class TMeasurement,
474 class TFrequencyContainer >
476 TFrequencyContainer >::MeasurementVectorType &
480 return this->GetMeasurementVector( this->GetIndex(ident) );
483 template<
class TMeasurement,
484 class TFrequencyContainer >
489 typename Self::Iterator iter = this->Begin();
490 typename Self::Iterator end = this->End();
492 while ( iter != end )
494 iter.SetFrequency(value);
499 template<
class TMeasurement,
500 class TFrequencyContainer >
507 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
509 return this->SetFrequency( this->GetInstanceIdentifier(index), value);
512 template<
class TMeasurement,
513 class TFrequencyContainer >
520 this->GetMeasurementVectorSize();
522 "Length mismatch: VariableDimensionHistogram::SetFrequency");
524 return this->SetFrequency( this->GetInstanceIdentifier(GetIndex(measurement)), value);
527 template<
class TMeasurement,
528 class TFrequencyContainer >
535 "Length mismatch: VariableDimensionHistogram::GetIndex(MeasurementVectorType, IndexType)");
538 this->IncreaseFrequency( this->GetInstanceIdentifier(index), value);
542 template<
class TMeasurement,
543 class TFrequencyContainer >
550 this->GetMeasurementVectorSize();
552 "Length mismatch: VariableDimensionHistogram::IncreaseFrequency");
554 IndexType index( measurementVectorSize );
555 this->GetIndex( measurement, index );
556 return this->IncreaseFrequency( this->GetInstanceIdentifier( index ), value );
559 template<
class TMeasurement,
560 class TFrequencyContainer >
562 TFrequencyContainer >::FrequencyType
567 "Length mismatch: VariableDimensionHistogram::GetFrequency");
569 return ( this->GetFrequency( this->GetInstanceIdentifier(index)) );
572 template<
class TMeasurement,
573 class TFrequencyContainer>
575 TFrequencyContainer >::MeasurementType
580 m_Max[dimension][n]) / 2);
583 template<
class TMeasurement,
584 class TFrequencyContainer >
586 TFrequencyContainer >::FrequencyType
598 while (current < last)
601 includeEnd = include + includeLength;
602 while(include < includeEnd)
604 frequency += GetFrequency(include);
607 current += nextOffset;
612 template<
class TMeasurement,
613 class TFrequencyContainer >
615 TFrequencyContainer >::TotalFrequencyType
619 return m_FrequencyContainer->GetTotalFrequency();
622 template<
class TMeasurement,
623 class TFrequencyContainer >
626 ::Quantile(
const unsigned int dimension,
const double &p)
const
629 const unsigned int size = this->GetSize(dimension);
633 double cumulated = 0;
634 double totalFrequency = double( this->GetTotalFrequency() );
635 double binProportion;
636 double min, max, interval;
641 p_n = NumericTraits< double >::Zero;
644 f_n = this->GetFrequency(n, dimension);
647 p_n = cumulated / totalFrequency;
650 while( n < size && p_n < p);
652 binProportion = f_n / totalFrequency;
654 min = double( this->GetBinMin(dimension, n - 1) );
655 max = double( this->GetBinMax(dimension, n - 1) );
656 interval = max - min;
657 return min + ((p - p_n_prev) / binProportion) * interval;
663 p_n = NumericTraits< double >::One;
666 f_n = this->GetFrequency(n, dimension);
669 p_n = NumericTraits< double >::One - cumulated / totalFrequency;
673 while( m < size && p_n > p);
675 binProportion = f_n / totalFrequency;
676 min = double( this->GetBinMin(dimension, n + 1) );
677 max = double( this->GetBinMax(dimension, n + 1) );
678 interval = max - min;
679 return max - ((p_n_prev - p) / binProportion) * interval;
683 template<
class TMeasurement,
684 class TFrequencyContainer >
689 Superclass::PrintSelf(os,indent);
694 os << indent <<
"ClipBinsAtEnds: True" << std::endl;
698 os << indent <<
"ClipBinsAtEnds: False" << std::endl;
700 os << indent <<
"FrequencyContainerPointer: " << m_FrequencyContainer