aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2007-10-13 14:31:27 +0000
committerGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2007-10-13 14:31:27 +0000
commit55e80e15990ce6bf589bdc3539c97c2a87830881 (patch)
treea7e8e903274f51741d532cc8c6fa04d916065667
parent12bcafdc7587d3ea14195eeeb1e9a307db6131cd (diff)
split MatrixOps.h into 3 files; rename ScalarOps.h; remove useless #includes.
-rw-r--r--src/Core.h5
-rw-r--r--src/Core/Difference.h83
-rw-r--r--src/Core/Matrix.h11
-rw-r--r--src/Core/MatrixOps.h245
-rw-r--r--src/Core/Object.h2
-rw-r--r--src/Core/Product.h136
-rw-r--r--src/Core/ScalarMultiple.h (renamed from src/Core/ScalarOps.h)6
-rw-r--r--src/Core/Sum.h84
-rw-r--r--src/Core/Util.h2
9 files changed, 313 insertions, 261 deletions
diff --git a/src/Core.h b/src/Core.h
index 2fd9423dd..715cedef5 100644
--- a/src/Core.h
+++ b/src/Core.h
@@ -12,6 +12,11 @@ namespace Eigen {
#include "Core/MatrixRef.h"
#include "Core/MatrixStorage.h"
#include "Core/Matrix.h"
+#include "Core/Eval.h"
+#include "Core/ScalarMultiple.h"
+#include "Core/Sum.h"
+#include "Core/Difference.h"
+#include "Core/Product.h"
#include "Core/Row.h"
#include "Core/Column.h"
#include "Core/Block.h"
diff --git a/src/Core/Difference.h b/src/Core/Difference.h
new file mode 100644
index 000000000..182555c83
--- /dev/null
+++ b/src/Core/Difference.h
@@ -0,0 +1,83 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra. Eigen itself is part of the KDE project.
+//
+// Copyright (C) 2006-2007 Benoit Jacob <jacob@math.jussieu.fr>
+//
+// Eigen is free software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 or (at your option) any later version.
+//
+// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details.
+//
+// You should have received a copy of the GNU General Public License along
+// with Eigen; if not, write to the Free Software Foundation, Inc., 51
+// Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. This exception does not invalidate any other reasons why a work
+// based on this file might be covered by the GNU General Public License.
+
+#ifndef EI_DIFFERENCE_H
+#define EI_DIFFERENCE_H
+
+template<typename Lhs, typename Rhs> class Difference
+ : public Object<typename Lhs::Scalar, Difference<Lhs, Rhs> >
+{
+ public:
+ typedef typename Lhs::Scalar Scalar;
+ typedef typename Lhs::ConstRef LhsRef;
+ typedef typename Rhs::ConstRef RhsRef;
+ friend class Object<Scalar, Difference>;
+
+ static const int RowsAtCompileTime = Lhs::RowsAtCompileTime,
+ ColsAtCompileTime = Rhs::ColsAtCompileTime;
+
+ Difference(const LhsRef& lhs, const RhsRef& rhs)
+ : m_lhs(lhs), m_rhs(rhs)
+ {
+ assert(lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols());
+ }
+
+ Difference(const Difference& other)
+ : m_lhs(other.m_lhs), m_rhs(other.m_rhs) {}
+
+ EI_INHERIT_ASSIGNMENT_OPERATORS(Difference)
+
+ private:
+ const Difference& _ref() const { return *this; }
+ const Difference& _constRef() const { return *this; }
+ int _rows() const { return m_lhs.rows(); }
+ int _cols() const { return m_lhs.cols(); }
+
+ Scalar _read(int row, int col) const
+ {
+ return m_lhs.read(row, col) - m_rhs.read(row, col);
+ }
+
+ protected:
+ const LhsRef m_lhs;
+ const RhsRef m_rhs;
+};
+
+template<typename Scalar, typename Derived1, typename Derived2>
+Difference<Derived1, Derived2>
+operator-(const Object<Scalar, Derived1> &mat1, const Object<Scalar, Derived2> &mat2)
+{
+ return Difference<Derived1, Derived2>(mat1.constRef(), mat2.constRef());
+}
+
+template<typename Scalar, typename Derived>
+template<typename OtherDerived>
+Derived &
+Object<Scalar, Derived>::operator-=(const Object<Scalar, OtherDerived> &other)
+{
+ return *this = *this - other;
+}
+
+#endif // EI_DIFFERENCE_H
diff --git a/src/Core/Matrix.h b/src/Core/Matrix.h
index 5717905b1..aad999a04 100644
--- a/src/Core/Matrix.h
+++ b/src/Core/Matrix.h
@@ -26,12 +26,6 @@
#ifndef EI_MATRIX_H
#define EI_MATRIX_H
-#include "Util.h"
-#include "Numeric.h"
-#include "Object.h"
-#include "MatrixRef.h"
-#include "MatrixStorage.h"
-
template<typename _Scalar, int _Rows, int _Cols>
class Matrix : public Object<_Scalar, Matrix<_Scalar, _Rows, _Cols> >,
public MatrixStorage<_Scalar, _Rows, _Cols>
@@ -142,9 +136,4 @@ EI_USING_MATRIX_TYPEDEFS_FOR_TYPE(ci) \
EI_USING_MATRIX_TYPEDEFS_FOR_TYPE(cf) \
EI_USING_MATRIX_TYPEDEFS_FOR_TYPE(cd)
-#include "Eval.h"
-#include "MatrixOps.h"
-#include "ScalarOps.h"
-
-
#endif // EI_MATRIX_H
diff --git a/src/Core/MatrixOps.h b/src/Core/MatrixOps.h
deleted file mode 100644
index 7cec76407..000000000
--- a/src/Core/MatrixOps.h
+++ /dev/null
@@ -1,245 +0,0 @@
-// This file is part of Eigen, a lightweight C++ template library
-// for linear algebra. Eigen itself is part of the KDE project.
-//
-// Copyright (C) 2006-2007 Benoit Jacob <jacob@math.jussieu.fr>
-//
-// Eigen is free software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the Free Software
-// Foundation; either version 2 or (at your option) any later version.
-//
-// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
-// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
-// details.
-//
-// You should have received a copy of the GNU General Public License along
-// with Eigen; if not, write to the Free Software Foundation, Inc., 51
-// Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-//
-// As a special exception, if other files instantiate templates or use macros
-// or functions from this file, or you compile this file and link it
-// with other works to produce a work based on this file, this file does not
-// by itself cause the resulting work to be covered by the GNU General Public
-// License. This exception does not invalidate any other reasons why a work
-// based on this file might be covered by the GNU General Public License.
-
-#ifndef EI_MATRIXOPS_H
-#define EI_MATRIXOPS_H
-
-template<typename Lhs, typename Rhs> class Sum
- : public Object<typename Lhs::Scalar, Sum<Lhs, Rhs> >
-{
- public:
- typedef typename Lhs::Scalar Scalar;
- typedef typename Lhs::ConstRef LhsRef;
- typedef typename Rhs::ConstRef RhsRef;
- friend class Object<Scalar, Sum>;
-
- static const int RowsAtCompileTime = Lhs::RowsAtCompileTime,
- ColsAtCompileTime = Rhs::ColsAtCompileTime;
-
- Sum(const LhsRef& lhs, const RhsRef& rhs)
- : m_lhs(lhs), m_rhs(rhs)
- {
- assert(lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols());
- }
-
- Sum(const Sum& other)
- : m_lhs(other.m_lhs), m_rhs(other.m_rhs) {}
-
- EI_INHERIT_ASSIGNMENT_OPERATORS(Sum)
-
- private:
-
- const Sum& _ref() const { return *this; }
- const Sum& _constRef() const { return *this; }
- int _rows() const { return m_lhs.rows(); }
- int _cols() const { return m_lhs.cols(); }
-
- Scalar _read(int row, int col) const
- {
- return m_lhs.read(row, col) + m_rhs.read(row, col);
- }
-
- protected:
- const LhsRef m_lhs;
- const RhsRef m_rhs;
-};
-
-template<typename Lhs, typename Rhs> class Difference
- : public Object<typename Lhs::Scalar, Difference<Lhs, Rhs> >
-{
- public:
- typedef typename Lhs::Scalar Scalar;
- typedef typename Lhs::ConstRef LhsRef;
- typedef typename Rhs::ConstRef RhsRef;
- friend class Object<Scalar, Difference>;
-
- static const int RowsAtCompileTime = Lhs::RowsAtCompileTime,
- ColsAtCompileTime = Rhs::ColsAtCompileTime;
-
- Difference(const LhsRef& lhs, const RhsRef& rhs)
- : m_lhs(lhs), m_rhs(rhs)
- {
- assert(lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols());
- }
-
- Difference(const Difference& other)
- : m_lhs(other.m_lhs), m_rhs(other.m_rhs) {}
-
- EI_INHERIT_ASSIGNMENT_OPERATORS(Difference)
-
- private:
- const Difference& _ref() const { return *this; }
- const Difference& _constRef() const { return *this; }
- int _rows() const { return m_lhs.rows(); }
- int _cols() const { return m_lhs.cols(); }
-
- Scalar _read(int row, int col) const
- {
- return m_lhs.read(row, col) - m_rhs.read(row, col);
- }
-
- protected:
- const LhsRef m_lhs;
- const RhsRef m_rhs;
-};
-
-template<int Index, int Size, typename Lhs, typename Rhs>
-struct MatrixProductUnroller
-{
- static void run(int row, int col, const Lhs& lhs, const Rhs& rhs,
- typename Lhs::Scalar &res)
- {
- MatrixProductUnroller<Index-1, Size, Lhs, Rhs>::run(row, col, lhs, rhs, res);
- res += lhs.read(row, Index) * rhs.read(Index, col);
- }
-};
-
-template<int Size, typename Lhs, typename Rhs>
-struct MatrixProductUnroller<0, Size, Lhs, Rhs>
-{
- static void run(int row, int col, const Lhs& lhs, const Rhs& rhs,
- typename Lhs::Scalar &res)
- {
- res = lhs.read(row, 0) * rhs.read(0, col);
- }
-};
-
-template<int Index, typename Lhs, typename Rhs>
-struct MatrixProductUnroller<Index, Dynamic, Lhs, Rhs>
-{
- static void run(int row, int col, const Lhs& lhs, const Rhs& rhs,
- typename Lhs::Scalar &res)
- {
- EI_UNUSED(row);
- EI_UNUSED(col);
- EI_UNUSED(lhs);
- EI_UNUSED(rhs);
- EI_UNUSED(res);
- }
-};
-
-template<typename Lhs, typename Rhs> class MatrixProduct
- : public Object<typename Lhs::Scalar, MatrixProduct<Lhs, Rhs> >
-{
- public:
- typedef typename Lhs::Scalar Scalar;
- typedef typename Lhs::ConstRef LhsRef;
- typedef typename Rhs::ConstRef RhsRef;
- friend class Object<Scalar, MatrixProduct>;
-
- static const int RowsAtCompileTime = Lhs::RowsAtCompileTime,
- ColsAtCompileTime = Rhs::ColsAtCompileTime;
-
- MatrixProduct(const LhsRef& lhs, const RhsRef& rhs)
- : m_lhs(lhs), m_rhs(rhs)
- {
- assert(lhs.cols() == rhs.rows());
- }
-
- MatrixProduct(const MatrixProduct& other)
- : m_lhs(other.m_lhs), m_rhs(other.m_rhs) {}
-
- EI_INHERIT_ASSIGNMENT_OPERATORS(MatrixProduct)
-
- private:
- const MatrixProduct& _ref() const { return *this; }
- const MatrixProduct& _constRef() const { return *this; }
- int _rows() const { return m_lhs.rows(); }
- int _cols() const { return m_rhs.cols(); }
-
- Scalar _read(int row, int col) const
- {
- Scalar res;
- if(Lhs::ColsAtCompileTime != Dynamic && Lhs::ColsAtCompileTime <= 16)
- MatrixProductUnroller<Lhs::ColsAtCompileTime-1, Lhs::ColsAtCompileTime, LhsRef, RhsRef>
- ::run(row, col, m_lhs, m_rhs, res);
- else
- {
- res = m_lhs(row, 0) * m_rhs(0, col);
- for(int i = 1; i < m_lhs.cols(); i++)
- res += m_lhs(row, i) * m_rhs(i, col);
- }
- return res;
- }
-
- protected:
- const LhsRef m_lhs;
- const RhsRef m_rhs;
-};
-
-template<typename Scalar, typename Derived1, typename Derived2>
-Sum<Derived1, Derived2>
-operator+(const Object<Scalar, Derived1> &mat1, const Object<Scalar, Derived2> &mat2)
-{
- return Sum<Derived1, Derived2>(mat1.constRef(), mat2.constRef());
-}
-
-template<typename Scalar, typename Derived1, typename Derived2>
-Difference<Derived1, Derived2>
-operator-(const Object<Scalar, Derived1> &mat1, const Object<Scalar, Derived2> &mat2)
-{
- return Difference<Derived1, Derived2>(mat1.constRef(), mat2.constRef());
-}
-
-template<typename Scalar, typename Derived>
-template<typename OtherDerived>
-MatrixProduct<Derived, OtherDerived>
-Object<Scalar, Derived>::lazyProduct(const Object<Scalar, OtherDerived> &other) const
-{
- return MatrixProduct<Derived, OtherDerived>(constRef(), other.constRef());
-}
-
-template<typename Scalar, typename Derived1, typename Derived2>
-Eval<MatrixProduct<Derived1, Derived2> >
-operator*(const Object<Scalar, Derived1> &mat1, const Object<Scalar, Derived2> &mat2)
-{
- return mat1.lazyProduct(mat2).eval();
-}
-
-template<typename Scalar, typename Derived>
-template<typename OtherDerived>
-Derived &
-Object<Scalar, Derived>::operator+=(const Object<Scalar, OtherDerived>& other)
-{
- return *this = *this + other;
-}
-
-template<typename Scalar, typename Derived>
-template<typename OtherDerived>
-Derived &
-Object<Scalar, Derived>::operator-=(const Object<Scalar, OtherDerived> &other)
-{
- return *this = *this - other;
-}
-
-template<typename Scalar, typename Derived>
-template<typename OtherDerived>
-Derived &
-Object<Scalar, Derived>::operator*=(const Object<Scalar, OtherDerived> &other)
-{
- return *this = *this * other;
-}
-
-#endif // EI_MATRIXOPS_H
diff --git a/src/Core/Object.h b/src/Core/Object.h
index 90962c46c..777798299 100644
--- a/src/Core/Object.h
+++ b/src/Core/Object.h
@@ -116,7 +116,7 @@ template<typename Scalar, typename Derived> class Object
) const;
template<typename OtherDerived>
- MatrixProduct<Derived, OtherDerived>
+ Product<Derived, OtherDerived>
lazyProduct(const Object<Scalar, OtherDerived>& other) const EI_ALWAYS_INLINE;
template<typename OtherDerived>
diff --git a/src/Core/Product.h b/src/Core/Product.h
new file mode 100644
index 000000000..29b11b74d
--- /dev/null
+++ b/src/Core/Product.h
@@ -0,0 +1,136 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra. Eigen itself is part of the KDE project.
+//
+// Copyright (C) 2006-2007 Benoit Jacob <jacob@math.jussieu.fr>
+//
+// Eigen is free software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 or (at your option) any later version.
+//
+// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details.
+//
+// You should have received a copy of the GNU General Public License along
+// with Eigen; if not, write to the Free Software Foundation, Inc., 51
+// Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. This exception does not invalidate any other reasons why a work
+// based on this file might be covered by the GNU General Public License.
+
+#ifndef EI_PRODUCT_H
+#define EI_PRODUCT_H
+
+template<int Index, int Size, typename Lhs, typename Rhs>
+struct ProductUnroller
+{
+ static void run(int row, int col, const Lhs& lhs, const Rhs& rhs,
+ typename Lhs::Scalar &res)
+ {
+ ProductUnroller<Index-1, Size, Lhs, Rhs>::run(row, col, lhs, rhs, res);
+ res += lhs.read(row, Index) * rhs.read(Index, col);
+ }
+};
+
+template<int Size, typename Lhs, typename Rhs>
+struct ProductUnroller<0, Size, Lhs, Rhs>
+{
+ static void run(int row, int col, const Lhs& lhs, const Rhs& rhs,
+ typename Lhs::Scalar &res)
+ {
+ res = lhs.read(row, 0) * rhs.read(0, col);
+ }
+};
+
+template<int Index, typename Lhs, typename Rhs>
+struct ProductUnroller<Index, Dynamic, Lhs, Rhs>
+{
+ static void run(int row, int col, const Lhs& lhs, const Rhs& rhs,
+ typename Lhs::Scalar &res)
+ {
+ EI_UNUSED(row);
+ EI_UNUSED(col);
+ EI_UNUSED(lhs);
+ EI_UNUSED(rhs);
+ EI_UNUSED(res);
+ }
+};
+
+template<typename Lhs, typename Rhs> class Product
+ : public Object<typename Lhs::Scalar, Product<Lhs, Rhs> >
+{
+ public:
+ typedef typename Lhs::Scalar Scalar;
+ typedef typename Lhs::ConstRef LhsRef;
+ typedef typename Rhs::ConstRef RhsRef;
+ friend class Object<Scalar, Product>;
+
+ static const int RowsAtCompileTime = Lhs::RowsAtCompileTime,
+ ColsAtCompileTime = Rhs::ColsAtCompileTime;
+
+ Product(const LhsRef& lhs, const RhsRef& rhs)
+ : m_lhs(lhs), m_rhs(rhs)
+ {
+ assert(lhs.cols() == rhs.rows());
+ }
+
+ Product(const Product& other)
+ : m_lhs(other.m_lhs), m_rhs(other.m_rhs) {}
+
+ EI_INHERIT_ASSIGNMENT_OPERATORS(Product)
+
+ private:
+ const Product& _ref() const { return *this; }
+ const Product& _constRef() const { return *this; }
+ int _rows() const { return m_lhs.rows(); }
+ int _cols() const { return m_rhs.cols(); }
+
+ Scalar _read(int row, int col) const
+ {
+ Scalar res;
+ if(Lhs::ColsAtCompileTime != Dynamic && Lhs::ColsAtCompileTime <= 16)
+ ProductUnroller<Lhs::ColsAtCompileTime-1, Lhs::ColsAtCompileTime, LhsRef, RhsRef>
+ ::run(row, col, m_lhs, m_rhs, res);
+ else
+ {
+ res = m_lhs(row, 0) * m_rhs(0, col);
+ for(int i = 1; i < m_lhs.cols(); i++)
+ res += m_lhs(row, i) * m_rhs(i, col);
+ }
+ return res;
+ }
+
+ protected:
+ const LhsRef m_lhs;
+ const RhsRef m_rhs;
+};
+
+template<typename Scalar, typename Derived>
+template<typename OtherDerived>
+Product<Derived, OtherDerived>
+Object<Scalar, Derived>::lazyProduct(const Object<Scalar, OtherDerived> &other) const
+{
+ return Product<Derived, OtherDerived>(constRef(), other.constRef());
+}
+
+template<typename Scalar, typename Derived1, typename Derived2>
+Eval<Product<Derived1, Derived2> >
+operator*(const Object<Scalar, Derived1> &mat1, const Object<Scalar, Derived2> &mat2)
+{
+ return mat1.lazyProduct(mat2).eval();
+}
+
+template<typename Scalar, typename Derived>
+template<typename OtherDerived>
+Derived &
+Object<Scalar, Derived>::operator*=(const Object<Scalar, OtherDerived> &other)
+{
+ return *this = *this * other;
+}
+
+#endif // EI_PRODUCT_H
diff --git a/src/Core/ScalarOps.h b/src/Core/ScalarMultiple.h
index 77c9b9342..8532411a6 100644
--- a/src/Core/ScalarOps.h
+++ b/src/Core/ScalarMultiple.h
@@ -23,8 +23,8 @@
// License. This exception does not invalidate any other reasons why a work
// based on this file might be covered by the GNU General Public License.
-#ifndef EI_SCALAROPS_H
-#define EI_SCALAROPS_H
+#ifndef EI_SCALARMULTIPLE_H
+#define EI_SCALARMULTIPLE_H
template<typename MatrixType> class ScalarMultiple
: public Object<typename MatrixType::Scalar, ScalarMultiple<MatrixType> >
@@ -110,4 +110,4 @@ EI_MAKE_SCALAR_OPS(std::complex<double>)
#undef EI_MAKE_SCALAR_OPS
-#endif // EI_SCALAROPS_H
+#endif // EI_SCALARMULTIPLE_H
diff --git a/src/Core/Sum.h b/src/Core/Sum.h
new file mode 100644
index 000000000..2b3ec5807
--- /dev/null
+++ b/src/Core/Sum.h
@@ -0,0 +1,84 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra. Eigen itself is part of the KDE project.
+//
+// Copyright (C) 2006-2007 Benoit Jacob <jacob@math.jussieu.fr>
+//
+// Eigen is free software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 or (at your option) any later version.
+//
+// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details.
+//
+// You should have received a copy of the GNU General Public License along
+// with Eigen; if not, write to the Free Software Foundation, Inc., 51
+// Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. This exception does not invalidate any other reasons why a work
+// based on this file might be covered by the GNU General Public License.
+
+#ifndef EI_SUM_H
+#define EI_SUM_H
+
+template<typename Lhs, typename Rhs> class Sum
+ : public Object<typename Lhs::Scalar, Sum<Lhs, Rhs> >
+{
+ public:
+ typedef typename Lhs::Scalar Scalar;
+ typedef typename Lhs::ConstRef LhsRef;
+ typedef typename Rhs::ConstRef RhsRef;
+ friend class Object<Scalar, Sum>;
+
+ static const int RowsAtCompileTime = Lhs::RowsAtCompileTime,
+ ColsAtCompileTime = Rhs::ColsAtCompileTime;
+
+ Sum(const LhsRef& lhs, const RhsRef& rhs)
+ : m_lhs(lhs), m_rhs(rhs)
+ {
+ assert(lhs.rows() == rhs.rows() && lhs.cols() == rhs.cols());
+ }
+
+ Sum(const Sum& other)
+ : m_lhs(other.m_lhs), m_rhs(other.m_rhs) {}
+
+ EI_INHERIT_ASSIGNMENT_OPERATORS(Sum)
+
+ private:
+
+ const Sum& _ref() const { return *this; }
+ const Sum& _constRef() const { return *this; }
+ int _rows() const { return m_lhs.rows(); }
+ int _cols() const { return m_lhs.cols(); }
+
+ Scalar _read(int row, int col) const
+ {
+ return m_lhs.read(row, col) + m_rhs.read(row, col);
+ }
+
+ protected:
+ const LhsRef m_lhs;
+ const RhsRef m_rhs;
+};
+
+template<typename Scalar, typename Derived1, typename Derived2>
+Sum<Derived1, Derived2>
+operator+(const Object<Scalar, Derived1> &mat1, const Object<Scalar, Derived2> &mat2)
+{
+ return Sum<Derived1, Derived2>(mat1.constRef(), mat2.constRef());
+}
+
+template<typename Scalar, typename Derived>
+template<typename OtherDerived>
+Derived &
+Object<Scalar, Derived>::operator+=(const Object<Scalar, OtherDerived>& other)
+{
+ return *this = *this + other;
+}
+
+#endif // EI_SUM_H
diff --git a/src/Core/Util.h b/src/Core/Util.h
index 431c008ed..8a9919ac6 100644
--- a/src/Core/Util.h
+++ b/src/Core/Util.h
@@ -52,7 +52,7 @@ template<typename MatrixType> class Transpose;
template<typename MatrixType> class Conjugate;
template<typename Lhs, typename Rhs> class Sum;
template<typename Lhs, typename Rhs> class Difference;
-template<typename Lhs, typename Rhs> class MatrixProduct;
+template<typename Lhs, typename Rhs> class Product;
template<typename MatrixType> class ScalarMultiple;
template<typename MatrixType> class Random;
template<typename ExpressionType> class Eval;