Re: [eigen] how to create a "virtual" array or matrix?
• To: eigen@xxxxxxxxxxxxxxxxxxx
• Subject: Re: [eigen] how to create a "virtual" array or matrix?
• From: Benoit Jacob <jacob.benoit.1@xxxxxxxxx>
• Date: Mon, 7 Jun 2010 16:28:51 -0400

I'm a work now so only have time to give a very short answer, so here goes.

In general, if you want to create a matrix expression from a functor
computing the coefficients, what you need is NullaryExpr:

http://eigen.tuxfamily.org/dox-devel/classEigen_1_1DenseBase.html#a84c2897928216cfb21ab81917e03b3a0

(and nevermind the typo telling you to look at Zero()).

If you want this to depend on another matrix expression, see
unaryExpr(). Depending on 2 other expression, see binaryExpr().

But in your special case you might not need that at all:

2010/6/7 David Roundy <roundyd@xxxxxxxxxxxxxxxxxxxxxxx>:
> Hi all,
>
> I'd like to create an object that describes an easily-computable
> array.  In particular, I want to work with some vectors describing
> functions of position.  In order to easily manipulate these, I'd like
> to create an object containing the value $|\vec{r}|^2$.  I could, of
> course, fill a vector with this value, but that would be a waste of
> memory, since it's really cheap to compute.

Right. If you want an abstract matrix/vector expression where all the
coeffs have a given value, see Constant():

http://eigen.tuxfamily.org/dox-devel/classEigen_1_1DenseBase.html#abb7652b9ae2c6ee26be9db276613c4f6

again nevermind the Zero() typo, Constant() is meant.

For more general cases, see above.
Benoit

>  And these vectors will
> eventually end up being quite large (maybe a GB or so), so I'd prefer
> not to allocate the memory.  In the past, I'd have just written a loop
> to sum over all positions, but that leads to ugly and hard-to-maintain
> code, since a non-trivial loop then shows up many times in the code
> (there's a bit of trickiness involving finding the Wigner-Seitz cell).
>  And it seems that template expressions provide almost precisely what
> I want.
>
> Is there a class that does this, e.g. something like
>
> class VirtualMatrix<...? {
>   VirtualMatrix(double (*func)(int, int));
> }
>
> which could just take a function of indices and turns it into a matrix?
>
> If there isn't something like this built into eigen, would it be easy
> to create? I've tried (briefly) to create a new class deriving
> MatrixBase, but immediately ran into trouble.  Perhaps I just know too
> little about C++ templates to use eigen effectively.  :(
>
> David Roundy
>
>
>



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