17 #ifndef __itkMahalanobisDistanceMembershipFunction_txx
18 #define __itkMahalanobisDistanceMembershipFunction_txx
23 namespace Statistics {
25 template <
class TVector >
34 m_Covariance.set_identity();
35 m_InverseCovariance.set_identity();
36 this->m_MeasurementVectorSize = 0;
39 template<
class TVector >
44 if( s == this->m_MeasurementVectorSize )
49 if( this->m_MeasurementVectorSize != 0 )
51 itkWarningMacro( <<
"Destructively resizing paramters of the DistanceToCentroidMembershipFunction." );
53 this->m_MeasurementVectorSize = s;
58 template <
class TVector >
63 if( this->m_MeasurementVectorSize != 0 )
65 if( mean.size() != this->m_MeasurementVectorSize )
67 itkExceptionMacro( <<
"Size of the centroid must be same as the length of"
68 <<
" each measurement vector.");
73 this->m_MeasurementVectorSize = mean.size();
80 template <
class TVector >
85 if( this->m_MeasurementVectorSize != 0 )
87 if( mean.
Size() != this->m_MeasurementVectorSize )
89 itkExceptionMacro( <<
"Size of the centroid must be same as the length of"
90 <<
" each measurement vector.");
95 this->m_MeasurementVectorSize = mean.
Size();
102 template <
class TVector >
111 template <
class TVector >
116 if( this->m_MeasurementVectorSize != 0 )
118 if( cov.rows() != this->m_MeasurementVectorSize ||
119 cov.cols() != this->m_MeasurementVectorSize )
121 itkExceptionMacro( <<
"Size of the centroid must be same as the length of"
122 <<
" each measurement vector.");
127 this->m_MeasurementVectorSize = cov.rows();
131 this->CalculateInverseCovariance();
134 template <
class TVector >
139 if( this->m_MeasurementVectorSize != 0 )
141 if( invcov.rows() != this->m_MeasurementVectorSize ||
142 invcov.cols() != this->m_MeasurementVectorSize )
144 itkExceptionMacro( <<
"Size of the centroid must be same as the length of"
145 <<
" each measurement vector.");
150 this->m_MeasurementVectorSize = invcov.rows();
154 m_Covariance = invcov;
155 this->CalculateInverseCovariance();
156 m_Covariance = m_InverseCovariance;
157 m_InverseCovariance = invcov;
160 template <
class TVector >
168 for(
unsigned int band_x = 0; band_x < m_Covariance.cols(); band_x++)
170 for(
unsigned int band_y = 0; band_y < m_Covariance.rows(); band_y++)
172 cov_sum += vnl_math_abs( m_Covariance[band_x][band_y] );
178 if( cov_sum < m_Epsilon )
180 m_InverseCovariance.set_size( m_Covariance.rows(), m_Covariance.cols() );
181 m_InverseCovariance.set_identity();
182 m_InverseCovariance *= m_DoubleMax;
187 if( m_Covariance.rows() < 2 )
189 m_InverseCovariance.set_size(1,1);
190 m_InverseCovariance[0][0] = 1.0 / m_Covariance[0][0];
194 m_InverseCovariance = vnl_matrix_inverse<double>(m_Covariance);
200 template <
class TVector >
207 m_TempVec.set_size( 1, this->m_MeasurementVectorSize);
208 m_TempMat.set_size( 1, this->m_MeasurementVectorSize);
211 for (
unsigned int i = 0; i < this->m_MeasurementVectorSize; i++ )
213 m_TempVec[0][i] = measurement[i] - m_Mean[i];
217 m_TempMat= m_TempVec * m_InverseCovariance;
220 temp = dot_product( m_TempMat.as_ref(), m_TempVec.as_ref() );
225 template <
class TVector >
231 Superclass::PrintSelf(os,indent);
233 if ( this->m_MeasurementVectorSize &&
234 m_Mean.size() == this->m_MeasurementVectorSize )
236 os << indent <<
"Mean: [";
237 for (i=0; (i + 1) < this->m_MeasurementVectorSize; i++)
239 os << m_Mean[i] <<
", ";
241 os << m_Mean[i] <<
"]" << std::endl;
245 os << indent <<
"Mean: not set or size does not match" << std::endl;
248 os << indent <<
"Number of Samples: " << m_NumberOfSamples << std::endl;
249 os << indent <<
"Covariance: " << std::endl;
250 os << m_Covariance << std::endl;
251 os << indent <<
"Inverse covariance: " << std::endl;
252 os << m_InverseCovariance << std::endl;