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

[ Thread Index | Date Index | More Archives ]

Hi Dan,

Indeed, for vectors, it calls operator()(Index), as in the following example:

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.


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

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!


Mail converted by MHonArc 2.6.19+