diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-01-13 10:25:50 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-01-13 10:25:50 +0100 |
commit | 279786e9875cc71c7bed1f78f8df1803be215904 (patch) | |
tree | a0cf52ffbff05aea3e6e1a80929fd265f0b2eefd | |
parent | ae4644cc6827bb1b6d654ceed8b3a0c256b1d173 (diff) |
Fix missing evaluator in outer-product
-rw-r--r-- | Eigen/src/Core/ProductEvaluators.h | 10 | ||||
-rw-r--r-- | test/product_small.cpp | 10 |
2 files changed, 16 insertions, 4 deletions
diff --git a/Eigen/src/Core/ProductEvaluators.h b/Eigen/src/Core/ProductEvaluators.h index 3cebbbd12..488eee00c 100644 --- a/Eigen/src/Core/ProductEvaluators.h +++ b/Eigen/src/Core/ProductEvaluators.h @@ -211,24 +211,26 @@ template<typename Dst, typename Lhs, typename Rhs, typename Func> EIGEN_DONT_INLINE void outer_product_selector_run(Dst& dst, const Lhs &lhs, const Rhs &rhs, const Func& func, const false_type&) { typedef typename Dst::Index Index; + typename evaluator<Rhs>::type rhsEval(rhs); // FIXME make sure lhs is sequentially stored // FIXME not very good if rhs is real and lhs complex while alpha is real too - // FIXME we should probably build an evaluator for dst and rhs + // FIXME we should probably build an evaluator for dst const Index cols = dst.cols(); for (Index j=0; j<cols; ++j) - func(dst.col(j), rhs.coeff(0,j) * lhs); + func(dst.col(j), rhsEval.coeff(0,j) * lhs); } // Row major result template<typename Dst, typename Lhs, typename Rhs, typename Func> EIGEN_DONT_INLINE void outer_product_selector_run(Dst& dst, const Lhs &lhs, const Rhs &rhs, const Func& func, const true_type&) { typedef typename Dst::Index Index; + typename evaluator<Lhs>::type lhsEval(lhs); // FIXME make sure rhs is sequentially stored // FIXME not very good if lhs is real and rhs complex while alpha is real too - // FIXME we should probably build an evaluator for dst and lhs + // FIXME we should probably build an evaluator for dst const Index rows = dst.rows(); for (Index i=0; i<rows; ++i) - func(dst.row(i), lhs.coeff(i,0) * rhs); + func(dst.row(i), lhsEval.coeff(i,0) * rhs); } template<typename Lhs, typename Rhs> diff --git a/test/product_small.cpp b/test/product_small.cpp index 8b132abb6..091955a0f 100644 --- a/test/product_small.cpp +++ b/test/product_small.cpp @@ -9,6 +9,7 @@ #define EIGEN_NO_STATIC_ASSERT #include "product.h" +#include <Eigen/LU> // regression test for bug 447 void product1x1() @@ -46,5 +47,14 @@ void test_product_small() Vector3f v = Vector3f::Random(); VERIFY_IS_APPROX( (v * v.transpose()) * v, (v * v.transpose()).eval() * v); } + + { + // regression test for pull-request #93 + Eigen::Matrix<double, 1, 1> A; A.setRandom(); + Eigen::Matrix<double, 18, 1> B; B.setRandom(); + Eigen::Matrix<double, 1, 18> C; C.setRandom(); + VERIFY_IS_APPROX(B * A.inverse(), B * A.inverse()[0]); + VERIFY_IS_APPROX(A.inverse() * C, A.inverse()[0] * C); + } #endif } |