[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