diff options
author | Benoit Jacob <jacob.benoit.1@gmail.com> | 2007-10-14 14:45:31 +0000 |
---|---|---|
committer | Benoit Jacob <jacob.benoit.1@gmail.com> | 2007-10-14 14:45:31 +0000 |
commit | a94a8c68e8d66fa2b06e37f3a47f1b7e1ddfa1bc (patch) | |
tree | 40edc0947b2dfe87181c4b62c0ba00e925a9f1b4 | |
parent | 3f979187600897221c7e807373eb267af4db1ada (diff) |
add fromArray() and wrapArray().
For example, the following now works:
double a1[3] = {1.0, 3.0, 2.0}, a2[3];
Vector3d::wrapArray(a2) = 2 * Vector3d::fromArray(a1);
cout << Vector3d::fromArray(a2) << endl; // output: 2,6,4
-rw-r--r-- | doc/tutorial.cpp | 5 | ||||
-rw-r--r-- | src/Core.h | 3 | ||||
-rw-r--r-- | src/Core/FromArray.h | 66 | ||||
-rw-r--r-- | src/Core/Object.h | 4 | ||||
-rw-r--r-- | src/Core/Util.h | 2 | ||||
-rw-r--r-- | src/Core/WrapArray.h | 73 |
6 files changed, 152 insertions, 1 deletions
diff --git a/doc/tutorial.cpp b/doc/tutorial.cpp index 4400bd2d1..8a7d499d3 100644 --- a/doc/tutorial.cpp +++ b/doc/tutorial.cpp @@ -32,5 +32,10 @@ int main(int, char **) cout << "Column 1 of m2 is:" << endl << m2.col(1) << endl; cout << "The transpose of m2 is:" << endl << m2.transpose() << endl; cout << "The matrix m2 with row 0 and column 1 removed is:" << endl << m2.minor(0,1) << endl; + + double a1[3] = {1.0, 3.0, 2.0}; + double a2[3]; + Vector3d::wrapArray(a2) = 2 * Vector3d::fromArray(a1); + cout << Vector3d::fromArray(a2) << endl; return 0; } diff --git a/src/Core.h b/src/Core.h index 78d14c151..c62124ac6 100644 --- a/src/Core.h +++ b/src/Core.h @@ -1,4 +1,3 @@ - #include <iostream> #include <complex> #include <cassert> @@ -30,5 +29,7 @@ namespace Eigen { #include "Core/Zero.h" #include "Core/Identity.h" #include "Core/Fuzzy.h" +#include "Core/FromArray.h" +#include "Core/WrapArray.h" } // namespace Eigen diff --git a/src/Core/FromArray.h b/src/Core/FromArray.h new file mode 100644 index 000000000..2350bf345 --- /dev/null +++ b/src/Core/FromArray.h @@ -0,0 +1,66 @@ +// 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_FROMARRAY_H +#define EI_FROMARRAY_H + +template<typename MatrixType> class FromArray + : public Object<typename MatrixType::Scalar, FromArray<MatrixType> > +{ + public: + typedef typename MatrixType::Scalar Scalar; + friend class Object<Scalar, FromArray<MatrixType> >; + + static const int RowsAtCompileTime = MatrixType::RowsAtCompileTime, + ColsAtCompileTime = MatrixType::ColsAtCompileTime; + + FromArray(int rows, int cols, const Scalar* array) : m_rows(rows), m_cols(cols), m_array(array) + { + assert(rows > 0 && cols > 0); + } + + private: + FromArray& _ref() { return *this; } + const FromArray& _constRef() const { return *this; } + int _rows() const { return m_rows; } + int _cols() const { return m_cols; } + + const Scalar& _read(int row, int col) const + { + return m_array[row + col * m_rows]; + } + + protected: + int m_rows, m_cols; + const Scalar* m_array; +}; + +template<typename Scalar, typename Derived> +FromArray<Derived> Object<Scalar, Derived>::fromArray(const Scalar* array, int rows, int cols) +{ + return FromArray<Derived>(rows, cols, array); +} + +#endif // EI_FROMARRAY_H diff --git a/src/Core/Object.h b/src/Core/Object.h index 5792385e6..6a3be1d05 100644 --- a/src/Core/Object.h +++ b/src/Core/Object.h @@ -117,6 +117,10 @@ template<typename Scalar, typename Derived> class Object zero(int rows = RowsAtCompileTime, int cols = ColsAtCompileTime); static Identity<Derived> identity(int rows = RowsAtCompileTime); + static FromArray<Derived> + fromArray(const Scalar* array, int rows = RowsAtCompileTime, int cols = ColsAtCompileTime); + static WrapArray<Derived> + wrapArray(Scalar* array, int rows = RowsAtCompileTime, int cols = ColsAtCompileTime); template<typename OtherDerived> bool isApprox( diff --git a/src/Core/Util.h b/src/Core/Util.h index 90840b308..bbe98f3bb 100644 --- a/src/Core/Util.h +++ b/src/Core/Util.h @@ -59,6 +59,8 @@ template<typename MatrixType> class Random; template<typename MatrixType> class Zero; template<typename MatrixType> class Identity; template<typename ExpressionType> class Eval; +template<typename MatrixType> class FromArray; +template<typename MatrixType> class WrapArray; template<typename T> struct ForwardDecl { diff --git a/src/Core/WrapArray.h b/src/Core/WrapArray.h new file mode 100644 index 000000000..4c32a3ee8 --- /dev/null +++ b/src/Core/WrapArray.h @@ -0,0 +1,73 @@ +// 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_WRAPARRAY_H +#define EI_WRAPARRAY_H + +template<typename MatrixType> class WrapArray + : public Object<typename MatrixType::Scalar, WrapArray<MatrixType> > +{ + public: + typedef typename MatrixType::Scalar Scalar; + friend class Object<Scalar, WrapArray<MatrixType> >; + + static const int RowsAtCompileTime = MatrixType::RowsAtCompileTime, + ColsAtCompileTime = MatrixType::ColsAtCompileTime; + + WrapArray(int rows, int cols, Scalar* array) : m_rows(rows), m_cols(cols), m_array(array) + { + assert(rows > 0 && cols > 0); + } + + EI_INHERIT_ASSIGNMENT_OPERATORS(WrapArray) + + private: + WrapArray& _ref() { return *this; } + const WrapArray& _constRef() const { return *this; } + int _rows() const { return m_rows; } + int _cols() const { return m_cols; } + + const Scalar& _read(int row, int col) const + { + return m_array[row + col * m_rows]; + } + + Scalar& _write(int row, int col) const + { + return m_array[row + col * m_rows]; + } + + protected: + int m_rows, m_cols; + Scalar* m_array; +}; + +template<typename Scalar, typename Derived> +WrapArray<Derived> Object<Scalar, Derived>::wrapArray(Scalar* array, int rows, int cols) +{ + return WrapArray<Derived>(rows, cols, array); +} + +#endif // EI_WRAPARRAY_H |