[ITK] [ITK-users] VariableLengthVector and multiplication

Dženan Zukić dzenanz at gmail.com
Wed Nov 22 10:17:15 EST 2017


Hi Cyril,

Francois has recently used compileif construct. That might help you. But I
can't find an instance of it right now.

Also, we are moving to discourse <https://discourse.itk.org/>. Please post
follow-ups there.

Regards,
Dženan

On Wed, Nov 22, 2017 at 9:54 AM, Cyril Mory <cyril.mory at creatis.insa-lyon.fr
> wrote:

> Thanks for this answer.
>
> I am trying the approach you suggested, and would like to write a dot
> product functor that would work either on scalars (in which case it would
> perform a simple product) or on itk::VariableLengthVector of scalars (in
> which case it would perform a dot product).
>
> I found the "itk::NumericTraits<TPixel>::GetLength()" method, which works
> in both cases, and so I tried this:
>
>
> namespace Functor
> {
>   template< class TPixel, class TInternal>
>   class DotProduct
>   {
>   public:
>     DotProduct() {}
>     ~DotProduct() {}
>     bool operator!=(const DotProduct &) const
>     {
>       return false;
>     }
>
>     bool operator==(const DotProduct & other) const
>     {
>       return !( *this != other );
>     }
>
>     inline TInternal operator()(const TPixel & A, const TPixel & B) const
>     {
>     TInternal out = 0;
>     for (unsigned int component=0; component <
> itk::NumericTraits<TPixel>::GetLength(); component++)
>       {
>       out += A[component] * B[component];
>       }
>     return out;
>     }
>   };
> } // end namespace functor
>
>
> But it does not compile with itk::Image inputs, since the pixels A and B
> have no [ ] operator. Is there a standard way around this problem ?
>
> Regards,
> Cyril
>
>
> On 22/11/2017 14:38, Lowekamp, Bradley (NIH/NLM/LHC) [C] wrote:
>
>> Hello,
>>
>> There are an incredible number of different per-pixel operations that
>> could be implemented as ITK filters. We cannot provide them all. Many of
>> the basic operations are implemented as ITK filters these include
>> performing the basic C++ operators, such as +, -, * and /, on a per-pixel
>> basis.
>>
>> As you indicate there are many possible meanings for multiplication of
>> vector images, which can lead to confusion.
>>
>> ITK has a flexible set of Unary[1], Binary[2] functor filters. Classes
>> like the MultiplyImageFilter[3], are implemented by deriving from the base
>> functor classes. However it is easier to just use the base functor filter
>> and set the proper or custom functor, as in this example [4].
>>
>> It is fairly easy to write a functor for your specific purposes by
>> following the existing set [5]. It is common for filters to internally
>> define a private functor to perform one step in a large filter. Moving from
>> writing for loops on pixels to writing custom functors is part of good
>> usage of ITK.
>>
>>
>> Brad
>>
>>
>> [1] https://itk.org/Doxygen/html/classitk_1_1UnaryFunctorImageFilter.html
>> [2] https://itk.org/Doxygen/html/classitk_1_1BinaryFunctorImageF
>> ilter.html
>> [3] https://itk.org/Doxygen/html/classitk_1_1MultiplyImageFilter.html
>> [4] https://itk.org/Doxygen/html/WikiExamples_2ImageProcessing_2
>> BinaryFunctorImageFilter_8cxx-example.html#_a1
>>
>> On 11/22/17, 5:15 AM, "Cyril Mory" <cyril.mory at creatis.insa-lyon.fr>
>> wrote:
>>
>>      Dear ITK users,
>>           I am using itk::VectorImage in some of my code, which uses
>>      itk::VariableLengthVector as pixel type. And I am wondering why
>>      itk::VariableLengthVector has so little support for multiplication.
>>      Currently, the * operator only supports multiplication by a scalar.
>>           It probably isn't simple, but I would need three additional
>> kinds of
>>      multiplication:
>>           - dot product with another VariableLengthVector (that has the
>> same
>>      length, although it is probably a waste of time to perform the check
>>      every time), returning a scalar
>>           - component-wise multiplication, returning a
>> VariableLengthVector of the
>>      same length
>>           - left or right multiplication with a matrix (possibly an
>>      itk::VariableSizeMatrix) that has the correct size, but I understand
>>      that this is probably the most complex one, and since it only occurs
>>      rarely in my code, I can handle it with conversions to vnl::vector
>> and
>>      vnl::matrix
>>           Are there constraints that prevent at least the dot product and
>>      component-wise multiplication operators from being implemented ? If
>> not,
>>      then I'd be happy to give it a try. Since both differ only by the
>> return
>>      type, two different operators would have to be used (I guess). Do you
>>      have suggestions (which one should use *, and what should be the
>> other
>>      operator) ? In itk::Vector and itk::CovariantVector, the * operator
>> is
>>      used for dot product.
>>           Regards,
>>           Cyril
>>                The ITK community is transitioning from this mailing list
>> to discourse.itk.org. Please join us there!
>>      ________________________________
>>      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://www.kitware.com/products/protraining.php
>>           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://public.kitware.com/mailman/listinfo/insight-users
>>
>>
>>
> The ITK community is transitioning from this mailing list to
> discourse.itk.org. Please join us there!
> ________________________________
> 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://www.kitware.com/products/protraining.php
>
> 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://public.kitware.com/mailman/listinfo/insight-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/community/attachments/20171122/cdf37fce/attachment-0001.html>
-------------- next part --------------
The ITK community is transitioning from this mailing list to discourse.itk.org. Please join us there!
________________________________
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://www.kitware.com/products/protraining.php

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://public.kitware.com/mailman/listinfo/insight-users


More information about the Community mailing list