[Insight-developers] Trying to make a Single Precision ITK, any suggestions on type weirdness?

Williams, Norman K norman-k-williams at uiowa.edu
Fri Oct 25 17:19:25 EDT 2013


This is a project Hans put me on this morning.  Basically trying to get
ITK to where all (or almost all) its internal computation happens in
single precision. There are several issues with actually unleashing this
on the world, but for now I'm just trying to get ITK to build, so I can
start testing.

The core change is to make the Point, Spacing and Direction Types in
itk::ImageBase use float instead of double.

Just making this one change did cause a bunch of compiler errors, but once
I solved the knotty problem of itkImageTransformHelper, it was mostly
pretty trivial, obvious changes.

Until I got down to this: multiplying a matrix by a vnlVector blows both
GCC and ICC's minds, in a way I don't understand.  It boils down to this
code:

typedef vnl_vector_fixed<float,3>    vnlVectorType;
typedef itk::Matrix<NumericType,3,3> MatrixType;

MatrixType    matrix;
vnlVectorType v2;
vnlVectorType resultVnlVector = matrix * v2;

For which Intel ICC gives this error:
[ 57%] Building CXX object
Modules/Core/Common/test/CMakeFiles/ITKCommon2TestDriver.dir/itkMatrixTest.
cxx.o
ITKv4/Modules/Core/Common/test/itkMatrixTest.cxx(68): error: more than one
operator "*" matches these operands:
            function "itk::Matrix<T, NRows, NColumns>::operator*(const
itk::Point<T, NColumns> &) const [with T=float, NRows=3U, NColumns=3U]"
            function "itk::Matrix<T, NRows, NColumns>::operator*(const
vnl_vector<T> &) const [with T=float, NRows=3U, NColumns=3U]"
            operand types are: MatrixType * vnlVectorType

GCC 4.4.8 gives basically the same error.

This makes no sense to me. It suggests that the compiler thinks the
argument, const vnl_vector_fixed<float,3> &, is close enough in type to
const itk::Point<float,3> & that it can't decide which version of
operator* to use.


Anyone have any suggestions on how to fix this?  The weirdest part is that
this test doesn't have anything to do with the change to itk::ImageBase.
I made some minor changes to itk::Point to allow for more flexible
initialization, but I did not make it type-compatible with
vnl_vector_fixed!

My current work is here:

https://github.com/BRAINSia/ITK/tree/SinglePrecisionImageParams

Thanks in advance for any help you can offer!
--
Kent Williams norman-k-williams at uiowa.edu






________________________________
Notice: This UI Health Care e-mail (including attachments) is covered by the Electronic Communications Privacy Act, 18 U.S.C. 2510-2521, is confidential and may be legally privileged.  If you are not the intended recipient, you are hereby notified that any retention, dissemination, distribution, or copying of this communication is strictly prohibited.  Please reply to the sender that you have received the message in error, then delete it.  Thank you.
________________________________


More information about the Insight-developers mailing list