Re: [eigen] Clang issue on MacOS when the set variable is used in the given data |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
On 19.04.2013 12:05, Gael Guennebaud wrote:
Your second version should be ok because you do not read foo(0) after
it has been changed, but that's still a dangerous use.
Does Eigen give any guarantees on how comma-initialization is performed?.
I always assumed that
foo << A, B, C;
is basically the same as
foo.segment<dim_A>(0 ) = A;
foo.segment<dim_B>(dim_A ) = B;
foo.segment<dim_C>(dim_A+dim_B) = C;
E.g., generally it would make sense to evaluate the result of
rot*foo.block(...) directly into the corresponding position of foo. That
quite certainly can lead to aliasing issues (but does not have to for
small matrices).
On Thu, Apr 18, 2013 at 8:58 AM, Arnaud BARRE <arnaud.barre@xxxxxxxxx> wrote:
For example, I have the following code:
Eigen::Matrix<double,4,1> foo;
foo << I, 1.0;
foo << 0.0, rot * (inv * foo).block(1,0,2,1), 1.0;
*JC = (local * foo).block(0,0,3,1);
What I don't understand here, is why you need to use foo for two
different temporaries? You can hardly be that short of memory.
Furthermore, what is inv? If it was a Eigen::Transform, you can directly
multiply by a 3d vector (no need to explicitly construct [I, 1.0]).
Assuming local is a Transform as well:
Eigen::Vector3d foo;
foo << 0, rot * (inv * I).tail<2>();
*JC = local * foo;
And if inv does not fit into a Transform, you can use I.homogeneous()
instead of (foo << I, 1.0);
Christoph
--
----------------------------------------------
Dipl.-Inf., Dipl.-Math. Christoph Hertzberg
Cartesium 0.049
Universität Bremen
Enrique-Schmidt-Straße 5
28359 Bremen
Tel: +49 (421) 218-64252
----------------------------------------------