[Insight-developers] itk::Vector Normalize method

Luis Ibanez luis.ibanez at kitware.com
Thu Jan 14 12:43:23 EST 2010


Hi Arnaud,

All your suggestions sound very reasonable to me.

I would just add that when checking for NULL in the
Normalize() method we probably should use the
Assert and Throw Exception macro (or a variant of it).

In your current suggested modification, calling Normalize
in a Null vector will still return a null vector.... well... I guess
it comes down to picking a mathematical definition of what
should be the normalization of a null vector...


I would vote for throwing an Exception in that case....


    Any thoughts ?


           Luis


--------------------------------
On Thu, Jan 14, 2010 at 10:47 AM, Gelas, Arnaud Joel Florent
<Arnaud_Gelas at hms.harvard.edu> wrote:
> 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
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://kitware.com/products/protraining.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-developers
>


More information about the Insight-developers mailing list