Re: [eigen] Sign function

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



Actually it is rather MatType::Constant(rows,cols,k), and this is an _expression_, so no allocation at all.


On Sat, Dec 8, 2012 at 3:13 PM, Carlos Becker <carlosbecker@xxxxxxxxx> wrote:
Hi Gael,

thanks!

If MatType is something 'huge' in the example you gave, would it get instantiated in memory? because then I should probably use another way of doing it.
For example, I would replace MatType::Constant(k)  with  VectorXd::Constant( N, k ), where N could be pretty large.

thanks again.


------------------------------------------
Carlos



On Sat, Dec 8, 2012 at 2:08 PM, Gael Guennebaud <gael.guennebaud@xxxxxxxxx> wrote:
You can do something like:

A += (B.array()>0)..select(MatType::Constant(k),-k);

Unfortunately the following cannot work because we have to know the matrix type returned by select from at least one of its arguments:

A += (B.array()>0).select(k,-k);

You can also use B.unaryExpr(std::ptr_fun(sign)) to reproduce "sign(B)".

gael


On Sat, Dec 8, 2012 at 12:26 PM, Carlos Becker <carlosbecker@xxxxxxxxx> wrote:
Hello everyone,

I am wondering which would be the fast way to compute the sign of every element in a vector or matrix, since I have to do the following element-wise:

A = A + k * sign(B)

where A and B are double matrices and k is a scalar.

I was trying to find some information in the docs but so far I didn't succeed.
I know I can do a boolean operation and then cast to double, multiply by 2 and subtract 1, but that doesn't seem very efficient.

Maybe some kind of custom element-wise processing, since it would be enough to compute the sign and then add k or -k to each element of A ?


Thanks!





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