Re: [ITK-users] VariableLengthVector and multiplication
Dženan Zukić <[email protected]> Wed, 22 Nov 2017 12:42:44 -0500
| Newsgroups | gmane.comp.lib.itk.user |
|---|---|
| Message-ID | <CAPf2UMQ6pi=FzyhHhR4hYQ2uPGHJ=zKAnkdSWmePRh7NZQib1A@mail.gmail.com> |
I found it. Construct is called *EnableIf*, and you can see how it is used in *ITK\Modules\Core\Common\test\itkEnableIfTest.cxx* Regards On Wed, Nov 22, 2017 at 10:17 AM, Dženan Zukić <[email protected]> wrote: > 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 <[email protected]. > 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_1UnaryFunctorImageFi >>> lter.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" <[email protected]> >>> 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 >> > > 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