[Insight-developers] itk::Vector Normalize method
Gelas, Arnaud Joel Florent
Arnaud_Gelas at hms.harvard.edu
Thu Jan 14 10:47:54 EST 2010
Hi guys,
I was going through the implementation of the normalize method of itk::Vector, and I was wondering if there is any reason not to test if the norm is null (see the implementation below)?
I guess it can create some problems when trying to normalize null vector...
/**
* Divide vector's components by vector's norm
*/
template<class T, unsigned int TVectorDimension>
void
Vector<T, TVectorDimension>
::Normalize( void )
{
const RealValueType norm = this->GetNorm();
for( unsigned int i=0; i<TVectorDimension; i++)
{
(*this)[i] = static_cast<T> (static_cast<RealValueType>((*this)[i]) / norm);
}
}
What about the following modification?
/**
* Divide vector's components by vector's norm
*/
template<class T, unsigned int TVectorDimension>
void
Vector<T, TVectorDimension>
::Normalize( void )
{
const RealValueType norm = this->GetNorm();
if( norm > 0 )
{
for( unsigned int i=0; i<TVectorDimension; i++)
{
(*this)[i] = static_cast<T> (static_cast<RealValueType>((*this)[i]) / norm);
}
}
}
I also think that the method GetNorm could be slightly optimized in the case where the norm is null.
/**
* Returns vector's Euclidean Norm
*/
template<class T, unsigned int TVectorDimension>
typename Vector<T, TVectorDimension>::RealValueType
Vector<T, TVectorDimension>
::GetNorm( void ) const
{
return RealValueType( vcl_sqrt(double(this->GetSquaredNorm()) ));
}
modification
/**
* Returns vector's Euclidean Norm
*/
template<class T, unsigned int TVectorDimension>
typename Vector<T, TVectorDimension>::RealValueType
Vector<T, TVectorDimension>
::GetNorm( void ) const
{
double sq_norm = this->GetSquaredNorm();
if( sq_norm > 0. )
{
return RealValueType( vcl_sqrt( sq_norm ) );
}
else
{
return static_cast<RealValueType >( sq_norm );
}
}
or
double sq_norm = this->GetSquaredNorm();
return ( sq_norm > 0. ) : static_cast<RealValueType >( vcl_sqrt( sq_norm ) ), sq_norm;
Any objection?
Arnaud
More information about the Insight-developers
mailing list