Re: [eigen] Confusion about MatrixBase::multiply() and MatrixBase::leftmultiply() |

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

*To*: eigen@xxxxxxxxxxxxxxxxxxx*Subject*: Re: [eigen] Confusion about MatrixBase::multiply() and MatrixBase::leftmultiply()*From*: jacob@xxxxxxxxxxxxxxx*Date*: Sun, 23 Nov 2008 16:39:34 +0100

Hi, Please, could you send me a selfcontained, compiling test case? Another thing, with your matrix A and your vector v,

A = [1..0..0..0] ....[0..1..0..0] ....[0..0..1.-5] ....[0..0..0..1] and the vector v = [0 0 -5 1]^T

we have: A*v = (0 0 -10 1) so A.multiply(v, &result) should set result to (0 0 -10 1), and we have: v*A = (0 0 -5 26) so A.leftmultiply(v, &result) should set result to (0 0 -5 26).

Cheers, Benoit Quoting Michael <michaelvsk@xxxxxx>:

Hi, and thanks for your reply. At first I also thought that this is the problem but then I tested it with a separate result vector and the results are exactly the same. Greetings Michael jacob@xxxxxxxxxxxxxxx schrieb:Hello, The problem here is that multiply(vector, result) and leftmultiply(vector, result) assume that vector is different from *result. In your case you tried to apply these methods with the same vector on both sides, and that produces a wrong result because the vector has been partly updated when it is used again to compute the rest of the product. This is called an aliasing effect. I can see that I forgot to mention that in the documentation. Please consider to port to Eigen2, as this issue is one of the many that were fixed. With Eigen2, there is no multiply() and leftmultiply() functions anymore, there is only * and *=, so you just do vec *= matrix or vec = vec * matrix, and it automatically handles aliasing; moreover if you know that there is no aliasing involved here (because the source and destination vectors are distinct) then you can do: dest_vec = (src_vec * matrix).lazy() to force lazy-evaluation i.e. remove the temporary variable and compute the product in place like eigen1's multiply() and leftmultiply() did. Cheers, Benoit Quoting Michael <michaelvsk@xxxxxx>:Hello, I have a problem with Eigen 1.05 and the functions MatrixBase::multiply() and MatrixBase::leftmultiply(). The help says that MatrixBase::multiply() computes *this * vector. and MatrixBase::leftmultiply() cumputes vector * *this (where vector will be transposed). But if I have the matrix A = [1..0..0..0] ....[0..1..0..0] ....[0..0..1.-5] ....[0..0..0..1] and the vector v = [0 0 -5 1]^T then A.multiply(*v, v) is [0 0 -5 24]^T but it should be [0 0 0 1]^T. And A.leftmultiply(*v, v) is [0 0 0 1]but it should be [0 0 -5 24]^T.If it possible that someone has confound something here? Or is itmy mistake?!Greetings Michael---------------------------------------------------------------- This message was sent using IMP, the Internet Messaging Program. ------

---------------------------------------------------------------- This message was sent using IMP, the Internet Messaging Program. ---

**Follow-Ups**:

**References**:

**Messages sorted by:**[ date | thread ]- Prev by Date:
**Re: [eigen] Confusion about MatrixBase::multiply() and MatrixBase::leftmultiply()** - Next by Date:
**Re: [eigen] Confusion about MatrixBase::multiply() and MatrixBase::leftmultiply()** - Previous by thread:
**Re: [eigen] Confusion about MatrixBase::multiply() and MatrixBase::leftmultiply()** - Next by thread:
**Re: [eigen] Confusion about MatrixBase::multiply() and MatrixBase::leftmultiply()**

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