Re: [eigen] DenseBase::NullaryExpr - Functor requirements

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Hi Gael,

thanks for your answer.

If I understand this correctly, then operator()(Index) is only called when 
eigen assumes that the Matrix is actually a vector. Could this happen when I 
am using reductions and/or array operations? Is there some simple way how to 
track down which method calls operator()(index) instead of operator()(index, 
index)?

Concerning the vectorization, is there a simple example somewhere in the eigen 
source?

I would be happy to submit a patch, once I understand the behavior a bit 
better (currently I do not feel to be able to improve anything).


Cheers,

Dan

On Friday 11 March 2016 12:11:06 Gael Guennebaud wrote:
> Hi Dan,
> 
> 
> Indeed, for vectors, it calls operator()(Index), as in the following
> example:
> 
> http://eigen.tuxfamily.org/dox-devel/classEigen_1_1DenseBase.html#a997ef3960
> 458fb5dedb8f7f78b068a9b
> 
> For really 2D matrices, operator()(Index) should not be called, otherwise
> we would need to know the storage order within the functor itself.
> 
> And yes, you can also add a packet(Index{,Index}) method to enable
> vectorization.
> 
> You are very welcome to propose a patch to improve the documentation
> regarding these aspects. A common adage says that documentation is better
> written by users.
> 
> cheers,
> gael
> 
> 
> On Thu, Mar 10, 2016 at 11:41 PM, Dan Čermák <dan.cermak@xxxxxxxxxxxxxxxxxxx
> > wrote:
> > 
> > Hi guys,
> > 
> > I am slightly confused by the required functions for the Functors to
> > create a
> > CwiseNullaryOp using DenseBase::NullaryExpr.
> > 
> > I thought it would be enough to write a struct which provides a operator()
> > (int,int) which returns the element i,j of the expression. However when
> > doing
> > that, I get frequent compilation errors which end with the following:
> > 
> > /usr/include/eigen3/Eigen/src/Core/CwiseNullaryOp.h:82:29: error: no match
> > for
> > call to '(...)'
> > 
> >        return m_functor(index)
> > 
> > (... <- is an ugly template expression which is my functor)
> > 
> > So after some experimentation, I guessed that this operator()(int) should
> > return also the matrix elements but compressed into a 1D array. But I am
> > not
> > sure at all about that. Although I seem to get the correct result when
> > doing
> > that.
> > 
> > Could you maybe point me to the documentation where this is specified
> > (sorry
> > couldn't find it)? Also is the single index operator dependent on the
> > storage
> > order of DenseBase?
> > 
> > And out of curiosity, when searching the file
> > Eigen/src/Core/CwiseNullaryOp.h
> > (the compile error from above occurred there), I found a function call
> > PacketScalar. What's that about? Is this for vectorization?
> > 
> > 
> > Thanks in advance!
> > 
> > Dan




Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/