[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/insight-users/attachments/20171122/cdf37fce/attachment.html>
More information about the Insight-users
mailing list