<div>The current implementation of CovariantVector::GetSquaredNorm() seems to assume that the component type may have a problem being multiplied and added (overflow). However, when the component type IS capable of these operations, a penalty is still paid in the conversion of everything to double (itk::NumericTraits&lt;every POD&gt;::RealValueType = double).</div>

<div><br></div><div>In my program, I have images of CovariantVector&lt;int, 3&gt; pixels and I get about a 20% speed up if I change the current implementation:</div><div><br></div><div>template&lt; class T, unsigned int NVectorDimension &gt;</div>

<div>typename CovariantVector&lt; T, NVectorDimension &gt;::RealValueType</div><div>CovariantVector&lt; T, NVectorDimension &gt;</div><div>::GetSquaredNorm(void) const</div><div>{</div><div>  RealValueType sum = NumericTraits&lt; RealValueType &gt;::Zero;</div>

<div><br></div><div>  for ( unsigned int i = 0; i &lt; NVectorDimension; i++ )</div><div>    {</div><div>    const RealValueType value = ( *this )[i];</div><div>    sum += value * value;</div><div>    }</div><div>  return sum;</div>

<div>}</div><div><br></div>to<div><br></div><div><div> template&lt; class T, unsigned int NVectorDimension &gt;</div><div> typename CovariantVector&lt; T, NVectorDimension &gt;::ValueType</div><div> CovariantVector&lt; T, NVectorDimension &gt;</div>

<div> ::GetSquaredNorm(void) const</div><div> {</div><div>   ValueType sum = NumericTraits&lt; ValueType &gt;::Zero;</div><div> </div><div>   for ( unsigned int i = 0; i &lt; NVectorDimension; i++ )</div><div>     {</div>

<div>     const ValueType value = ( *this )[i];</div><div>     sum += value * value;</div><div>     }</div><div>   return sum;</div><div> }</div><div><br></div><div>(note that the return type as well as the internal type has changed).</div>

<div><br></div><div>I can&#39;t think of a reasonable way to determine automatically if there will be a problem (it is not just a signed/unsigned type of problem, but rather it actually depends how large the values are relative to the size of the type). Would it make sense to add a second function called something like GetSquaredNormNoCast() or something like that that can be used in cases where the developer knows that there will be no chance of overflow and would like to get the speed savings?</div>
<div><br></div><div>Thanks,</div><div><br></div>David<br>
</div>