diff --git a/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.h b/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.h index 391e2aed443433b6e6b2f7b03bdc88ec2aad25bf..5739da2039c65cffd741edc693b4286f18787278 100644 --- a/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.h +++ b/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.h @@ -9,11 +9,11 @@ Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. See OTBCopyright.txt for details. - Copyright (c) Institut Telecom / Telecom Bretagne. All rights reserved. + Copyright (c) Institut Telecom / Telecom Bretagne. All rights reserved. See ITCopyright.txt for details. - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ @@ -30,17 +30,17 @@ namespace Statistics { /** \class FlexibleDistanceWithMissingValue * \brief Non-Euclidean distance function facing missing value. * - * This class is derived from EuclideanDistanceWithMissingValuePow2 class to - * deal with missing data. In addition, the initial Evaluate method performs + * This class is derived from EuclideanDistanceWithMissingValuePow2 class to + * deal with missing data. In addition, the initial Evaluate method performs * a flexible calculation of distance when a component does contain data. * - * The general formlation is defined as: + * The general formulation is defined as: * \f$ - d(x,y) = \sum_i | x_i^a - y_i^a |^b. + d(x,y) = \sum_i | x_i^a - y_i^a |^b. \f$ - * + * * The class can be templated over any container that holds data elements, as - * for template of EuclideanDistance. + * for template of EuclideanDistance. * * The only restriction is that elements have to support '\code{NaN}'. * @@ -54,7 +54,7 @@ class ITK_EXPORT FlexibleDistanceWithMissingValue : /** Standard "Self" typedef. */ typedef FlexibleDistanceWithMissingValue Self; typedef otb::Statistics::EuclideanDistanceWithMissingValuePow2< TVector > Superclass; - typedef itk::SmartPointer< Self > Pointer ; + typedef itk::SmartPointer< Self > Pointer ; typedef itk::SmartPointer<const Self> ConstPointer; typedef typename Superclass::MeasurementVectorSizeType MeasurementVectorSizeType; @@ -75,7 +75,7 @@ class ITK_EXPORT FlexibleDistanceWithMissingValue : double Evaluate(const TVector &x1, const TVector &x2) const ; /** Gets the cooridnate distance between a and b. NOTE: a and b - * should be type of component */ + * should be type of component */ double Evaluate(const ValueType &a, const ValueType &b) const ; /** Returns true if the distance between x and the origin is less @@ -84,10 +84,10 @@ class ITK_EXPORT FlexibleDistanceWithMissingValue : return Superclass::IsWithinRange( x, radius ); } /** Set the value of the parameter a and b. - * Those parameters are defined as static component in order to call it far + * Those parameters are defined as static component in order to call it far * away from the instanciation of the class (through the SOM training for instance) */ static double Alpha; - static double Beta; + static double Beta; static void SetAlphaBeta( double a, double b); /** test if it is ordinary Euclidean distance */ @@ -95,7 +95,7 @@ class ITK_EXPORT FlexibleDistanceWithMissingValue : protected: FlexibleDistanceWithMissingValue() {} - virtual ~FlexibleDistanceWithMissingValue() {} + virtual ~FlexibleDistanceWithMissingValue() {} }; // end of class /** Static variable instanciation */ diff --git a/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.txx b/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.txx index c7056cf80a9ada8553bfba57b4d14c6e0896d1ad..25ba273e0ca198eec11c9f4886039dea891a49ab 100644 --- a/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.txx +++ b/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.txx @@ -9,11 +9,11 @@ Copyright (c) Centre National d'Etudes Spatiales. All rights reserved. See OTBCopyright.txt for details. - Copyright (c) Institut Telecom / Telecom Bretagne. All rights reserved. + Copyright (c) Institut Telecom / Telecom Bretagne. All rights reserved. See ITCopyright.txt for details. - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ @@ -37,7 +37,7 @@ FlexibleDistanceWithMissingValue< TVector > if (IsEuclidean()) return Superclass::Evaluate(x1,x2); - if( itk::MeasurementVectorTraits::GetLength( x1 ) != + if( itk::MeasurementVectorTraits::GetLength( x1 ) != itk::MeasurementVectorTraits::GetLength( x2 ) ) { itkExceptionMacro( << "Vector lengths must be equal." ); @@ -49,7 +49,7 @@ FlexibleDistanceWithMissingValue< TVector > { if ( !IsMissingValue( x1[i] ) && !IsMissingValue( x2[i] ) ) { - temp = pow( fabs( pow(x1[i],this->Alpha) - pow(x2[i],this->Alpha) ), this->Beta ); + temp = vcl_pow( vcl_abs( vcl_pow(x1[i],this->Alpha) - vcl_pow(x2[i],this->Alpha) ), this->Beta ); distance += temp ; } } @@ -65,15 +65,15 @@ FlexibleDistanceWithMissingValue< TVector > if ( IsEuclidean() ) return Superclass::Evaluate(x); - MeasurementVectorSizeType + MeasurementVectorSizeType measurementVectorSize = this->GetMeasurementVectorSize(); - if(measurementVectorSize == 0) + if(measurementVectorSize == 0) { itkExceptionMacro( << "Please set the MeasurementVectorSize first" ); } - itk::MeasurementVectorTraits::Assert( this->m_Origin, measurementVectorSize, + itk::MeasurementVectorTraits::Assert( this->m_Origin, measurementVectorSize, "EuclideanDistance::Evaluate Origin and input vector have different lengths"); double temp, distance = itk::NumericTraits< double >::Zero ; @@ -82,7 +82,7 @@ FlexibleDistanceWithMissingValue< TVector > { if ( !IsMissingValue( this->GetOrigin()[i] ) && !IsMissingValue( x[i] ) ) { - temp = pow( fabs( pow(this->GetOrigin()[i],this->Alpha) - pow(x[i],this->Alpha) ), this->Beta) ; + temp = vcl_pow( vcl_abs( vcl_pow(this->GetOrigin()[i],this->Alpha) - vcl_pow(x[i],this->Alpha) ), this->Beta) ; distance += temp ; } } @@ -97,12 +97,12 @@ FlexibleDistanceWithMissingValue< TVector > { if (IsEuclidean()) return Superclass::Evaluate(a,b); - + // FIXME throw NaN exception or not ?? if ( IsMissingValue( a ) || IsMissingValue( b ) ) return 0.0; - double temp = pow(fabs(pow(a,this->Alpha) - pow(b,this->Alpha)), this->Beta) ; + double temp = vcl_pow(vcl_abs(vcl_pow(a,this->Alpha) - vcl_pow(b,this->Alpha)), this->Beta) ; return temp ; } template< class TVector > @@ -124,7 +124,7 @@ FlexibleDistanceWithMissingValue< TVector > return true; } else - { + { return false; } } diff --git a/Testing/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.cxx b/Testing/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.cxx index 0056de39674ee03c1817ed5dec68563668ea9d0d..ab849101ba0127b6747c421a1433efd8a72c1157 100644 --- a/Testing/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.cxx +++ b/Testing/Code/BasicFilters/otbFlexibleDistanceWithMissingValue.cxx @@ -30,6 +30,8 @@ int otbFlexibleDistanceWithMissingValue( int argc, char * argv[] ) typedef itk::VariableLengthVector< double > VectorType; typedef otb::Statistics::FlexibleDistanceWithMissingValue< VectorType > DistanceType; + const double epsilon = 0.00000001; + float a = 2.0; float b = 0.5; DistanceType::SetAlphaBeta(a,b); @@ -44,7 +46,7 @@ int otbFlexibleDistanceWithMissingValue( int argc, char * argv[] ) double distanceValue = dist->Evaluate( x, y ); std::cout << "Distance: " << distanceValue << std::endl; - if ( distanceValue == 3. ) + if ( (distanceValue - 3.*vcl_pow(3,b)) < epsilon ) return EXIT_SUCCESS; else return EXIT_FAILURE;