[Insight-developers] itk::Vector Normalize method
Bradley Lowekamp
blowekamp at mail.nih.gov
Thu Jan 14 13:36:12 EST 2010
I object to these changes.
Why do you expect the normalize value of a zero vector to be 0 as apposed to "inf"? Can you not check for the "inf" value with vnl_math_isinf() function?
Why do you think you GetNorm methods improves performance? Did you actually check?
I also strongly object to exception being thrown in low level numerical methods.
Brad
On Jan 14, 2010, at 1:17 PM, Arnaud Gelas wrote:
> I would agree with you about throwing an exception in the case of NULL
> vector.
> However, when computing mesh normals on a mesh with boundaries it
> sometimes
> happens on some point of the boundary. In such a case, I am not sure
> an exception
> should be thrown.
>
> But how should we define normalization for NULL vectors?
> (I have just checked in VTK, the normalization of a NULL vector is a
> NULL vector and it returns the norm).
>
> Can I proceed and test these changes? any suggestions / thoughts?
>
> Arnaud
>
> On Jan 14, 2010, at 12:43 PM, Luis Ibanez wrote:
>
>> 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
>>>
>
> _______________________________________________
> 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
========================================================
Bradley Lowekamp
Lockheed Martin Contractor for
Office of High Performance Computing and Communications
National Library of Medicine
blowekamp at mail.nih.gov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/mailman/private/insight-developers/attachments/20100114/4ba74997/attachment.htm>
More information about the Insight-developers
mailing list