diff --git a/src/Core/Map.h b/src/Core/Map.h index e62603195..835d54d91 100644 --- a/src/Core/Map.h +++ b/src/Core/Map.h @@ -36,7 +36,7 @@ template class Map static const int RowsAtCompileTime = MatrixType::RowsAtCompileTime, ColsAtCompileTime = MatrixType::ColsAtCompileTime; - Map(int rows, int cols, Scalar* array) : m_rows(rows), m_cols(cols), m_data(array) + Map(Scalar* data, int rows, int cols) : m_data(data), m_rows(rows), m_cols(cols) { assert(rows > 0 && cols > 0); } @@ -59,14 +59,22 @@ template class Map } protected: - int m_rows, m_cols; Scalar* m_data; + int m_rows, m_cols; }; template -Map MatrixBase::map(const Scalar* array, int rows, int cols) +Map MatrixBase::map(const Scalar* data, int rows, int cols) { - return Map(rows, cols, const_cast(array)); + return Map(const_cast(data),rows, cols); +} + +template +Matrix<_Scalar, _Rows, _Cols> + ::Matrix(const Scalar *data, int rows, int cols) + : Storage(rows, cols) +{ + *this = Map(const_cast(data), rows, cols); } #endif // EIGEN_FROMARRAY_H diff --git a/src/Core/Matrix.h b/src/Core/Matrix.h index 615166876..b2a747aba 100644 --- a/src/Core/Matrix.h +++ b/src/Core/Matrix.h @@ -144,6 +144,8 @@ class Matrix : public MatrixBase<_Scalar, Matrix<_Scalar, _Rows, _Cols> >, (Storage::m_data)[2] = z; (Storage::m_data)[3] = w; } + explicit Matrix(const Scalar *data, int rows = RowsAtCompileTime, + int cols = ColsAtCompileTime); template Matrix(const MatrixBase& other) diff --git a/src/Core/MatrixBase.h b/src/Core/MatrixBase.h index f0d0221da..e1ee000d8 100644 --- a/src/Core/MatrixBase.h +++ b/src/Core/MatrixBase.h @@ -195,7 +195,6 @@ template class MatrixBase Scalar& z() { return coeffRef(2, UserDebugging); } Scalar& w() { return coeffRef(3, UserDebugging); } - Eval eval() const EIGEN_ALWAYS_INLINE; }; diff --git a/test/basicstuff.cpp b/test/basicstuff.cpp index 85793e254..a1723a429 100644 --- a/test/basicstuff.cpp +++ b/test/basicstuff.cpp @@ -150,12 +150,14 @@ template void basicStuff(const MatrixType& m) // test Map.h Scalar* array1 = new Scalar[rows]; Scalar* array2 = new Scalar[rows]; - Matrix::map(array1, rows) = Matrix::random(rows); - Matrix::map(array2, rows) - = Matrix::map(array1, rows); - Matrix ma1 = Matrix::map(array1, rows); - Matrix ma2 = Matrix::map(array2, rows); + typedef Matrix VectorX; + VectorX::map(array1, rows) = VectorX::random(rows); + VectorX::map(array2, rows) = VectorX::map(array1, rows); + VectorX ma1 = VectorX::map(array1, rows); + VectorX ma2 = VectorX::map(array2, rows); VERIFY_IS_APPROX(ma1, ma2); + VERIFY_IS_APPROX(ma1, VectorX(array2, rows)); + delete[] array1; delete[] array2; }