Re: [eigen] Sign function
• To: eigen <eigen@xxxxxxxxxxxxxxxxxxx>
• Subject: Re: [eigen] Sign function
• From: Gael Guennebaud <gael.guennebaud@xxxxxxxxx>
• Date: Sat, 8 Dec 2012 17:12:26 +0100
• Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type; bh=moMx1n14+79kIcij4gXorET+IxoW93gbSEQc2RLxS+s=; b=fBYL/69HSYRr7mHseFZ9CueiZjGEcg3gTHgzWbfMWFmrP5Z5zHKzSJmH3aTGcR52dM Ddi9BldxjqSFdPDX2AaX8YPP35aZL5cpRKKdQBajDwb4l4Bt5+PyhxN//Je4gnehnk0V aWZhU72VRukq14VosSdI0w9KXyY9yfecKAuyEm54rZR+nK4VVFyicYnLDhWE8/pQq2vp wAMYTEVXa/tVMXW6tWr/k+C/of3Zu8x3I2Q/sLox2NmVriaBqTgUgwNim5eT5Y8LRGXs HK4JbQ4YCyYWrdWe01E9XL6aJ8rFKzBYBke67ED1bEc1l8h1lcUsIBCGDYtfvbLZLyCD IeSw==

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 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 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 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/