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 #include #include @@ -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 +// +// 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 class FromArray + : public Object > +{ + public: + typedef typename MatrixType::Scalar Scalar; + friend class Object >; + + 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 +FromArray Object::fromArray(const Scalar* array, int rows, int cols) +{ + return FromArray(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 class Object zero(int rows = RowsAtCompileTime, int cols = ColsAtCompileTime); static Identity identity(int rows = RowsAtCompileTime); + static FromArray + fromArray(const Scalar* array, int rows = RowsAtCompileTime, int cols = ColsAtCompileTime); + static WrapArray + wrapArray(Scalar* array, int rows = RowsAtCompileTime, int cols = ColsAtCompileTime); template 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 class Random; template class Zero; template class Identity; template class Eval; +template class FromArray; +template class WrapArray; template 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 +// +// 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 class WrapArray + : public Object > +{ + public: + typedef typename MatrixType::Scalar Scalar; + friend class Object >; + + 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 +WrapArray Object::wrapArray(Scalar* array, int rows, int cols) +{ + return WrapArray(rows, cols, array); +} + +#endif // EI_WRAPARRAY_H