Re: [eigen] |

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

*To*: eigen@xxxxxxxxxxxxxxxxxxx*Subject*: Re: [eigen]*From*: Benoit Jacob <jacob.benoit.1@xxxxxxxxx>*Date*: Sun, 30 May 2010 13:46:12 -0400*Dkim-signature*: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type; bh=xo6B8w939o2fv1cAIe2AjBO5NLrd7Xv6DfczaH36laM=; b=o1AaW+PjtijsYVeXieUbNhrGRYpC/GaU3cGFNU4HUGYwsy8ZFv+MXPgaivUAzwdpsL XBPvpviSxLyF+2D2M5+iVHAhlhLL1NOcXEaMYRGKapw8Idli+5uXKfgbjjM1iwU++IVM EmnVynGgf/8TkfLDHhX+6bV8H1T+vt+TnVb7w=*Domainkey-signature*: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; b=qqHiTKGT5G5VqQmok/92gG9VlE6gyPGpQpn0UJbYpQ/WRjE6mBOJIBb5JnLsuxHAS+ mSEy2W91/Hn2KN7kJzn2ilUoc40Ihn08G4/VJZfOXPbu/ANED9xg6+6uQrXwvN60A9XW 9lzB/yx+5wffrBn8R5hDB75C2Qe2j6XcOmhbU=

This is now fixed.

The problem was not specific to inverse(), but existed for all ReturnByValue-enabled function. For example, doing x = y.solve(x) would probably have exhibited the same aliasing issues.

The fix was to make ReturnByValue evaluate-before-assigning. If you want the old behavior (slightly more efficient), you can use .noalias() to tell Eigen not to care about aliasing, like this:

x.noalias() = y.inverse(); /// don't do this if y aliases x !!

Since this is the behavior for products, it felt natural, API-wise, to do the same for other "multiplicative" operations such as inverse(), and more generally, solve() and friends.

Benoit

2010/5/30 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>

aaahh... this had me puzzled for a while, but what you really have here is an aliasing problem. With the devel branch, when you do S = S.inverse(), S starts being overwritten with its inverse and then read again to compute the rest of the inverse... i need to have a look at the code to see if we're getting any speed gain from that, a priori i'd say let's work like in 2.0, taking care of aliasing, and if later there is demand for a super optimized noalias variant, we can then add it with an explicit name like a.noalias() = a.inverse(), like for products.

Benoit2010/5/28 SHIROKOBROD Oleg <Oleg.Shirokobrod@xxxxxxxxxx>Hello,

I’ve met a problem with development branch. Here you are the case.

{ -2.0 -1.0 }

I have a 2x2 matrix S = { }

{ 0.00026130287408377900 -2.0 }

and I want to inverse it. This is the code I compiled with MSVS 2008

#include <Eigen\Core>

#include <Eigen\LU>

Eigen::Matrix<double, 2, 2> S;

S << -2.0 , -1.0 , 0.00026130287408377900 , -2.0;

S = S.inverse();

Eigen2 gives the right answer

{-0.499967339

0.24998367}

S.inverse = {

{-6.53215E-05

-0.499967339}

Eigen3 (development branch I got on 26.05) gives a wrong answer

{-0.499967339

0.24998367}

S.inverse = {

{-6.53215E-05

-0.124983670170524}

What’s wrong?

Thank you,

Oleg Shirokobrod

___________________________________________________________________________

This e-mail is confidential and is for the addressee only. Please refer to

www.oxinst.com/email-statement for regulatory information.

**References**:**[eigen]***From:*SHIROKOBROD Oleg

**Re: [eigen]***From:*Benoit Jacob

**Messages sorted by:**[ date | thread ]- Prev by Date:
**Re: [eigen] skipXxx / computeXxx parameters in Eigenvalues module** - Next by Date:
**[eigen] Index types change pushed** - Previous by thread:
**Re: [eigen]** - Next by thread:
**[eigen] Possible bug in vector-matrix multiplication?**

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