diff options
author | Gael Guennebaud <g.gael@free.fr> | 2016-11-18 10:17:34 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2016-11-18 10:17:34 +0100 |
commit | 8193ffb3d38b56c9295f204dc57dc6bac74f58aa (patch) | |
tree | b3eb8251f3317557e2d3cc6a462ef285869e9250 | |
parent | cebff7e3a22d3fde9f83f11fc44a4e8166e6cc2d (diff) |
bug #1343: fix compilation regression in mat+=selfadjoint_view.
Generic EigenBase2EigenBase assignment was incomplete.
-rw-r--r-- | Eigen/src/Core/AssignEvaluator.h | 24 | ||||
-rw-r--r-- | test/selfadjoint.cpp | 15 |
2 files changed, 37 insertions, 2 deletions
diff --git a/Eigen/src/Core/AssignEvaluator.h b/Eigen/src/Core/AssignEvaluator.h index ffe1dd0ca..6225bd73d 100644 --- a/Eigen/src/Core/AssignEvaluator.h +++ b/Eigen/src/Core/AssignEvaluator.h @@ -876,6 +876,30 @@ struct Assignment<DstXprType, SrcXprType, Functor, EigenBase2EigenBase, Weak> eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); src.evalTo(dst); } + + EIGEN_DEVICE_FUNC + static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/) + { + Index dstRows = src.rows(); + Index dstCols = src.cols(); + if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) + dst.resize(dstRows, dstCols); + + eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); + src.addTo(dst); + } + + EIGEN_DEVICE_FUNC + static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/) + { + Index dstRows = src.rows(); + Index dstCols = src.cols(); + if((dst.rows()!=dstRows) || (dst.cols()!=dstCols)) + dst.resize(dstRows, dstCols); + + eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); + src.subTo(dst); + } }; } // namespace internal diff --git a/test/selfadjoint.cpp b/test/selfadjoint.cpp index 76dab6d64..92401e506 100644 --- a/test/selfadjoint.cpp +++ b/test/selfadjoint.cpp @@ -21,7 +21,9 @@ template<typename MatrixType> void selfadjoint(const MatrixType& m) Index cols = m.cols(); MatrixType m1 = MatrixType::Random(rows, cols), - m3(rows, cols); + m2 = MatrixType::Random(rows, cols), + m3(rows, cols), + m4(rows, cols); m1.diagonal() = m1.diagonal().real().template cast<Scalar>(); @@ -30,10 +32,19 @@ template<typename MatrixType> void selfadjoint(const MatrixType& m) VERIFY_IS_APPROX(MatrixType(m3.template triangularView<Upper>()), MatrixType(m1.template triangularView<Upper>())); VERIFY_IS_APPROX(m3, m3.adjoint()); - m3 = m1.template selfadjointView<Lower>(); VERIFY_IS_APPROX(MatrixType(m3.template triangularView<Lower>()), MatrixType(m1.template triangularView<Lower>())); VERIFY_IS_APPROX(m3, m3.adjoint()); + + m3 = m1.template selfadjointView<Upper>(); + m4 = m2; + m4 += m1.template selfadjointView<Upper>(); + VERIFY_IS_APPROX(m4, m2+m3); + + m3 = m1.template selfadjointView<Lower>(); + m4 = m2; + m4 -= m1.template selfadjointView<Lower>(); + VERIFY_IS_APPROX(m4, m2-m3); } void bug_159() |