From 559a29f92d39f9b58cb76710f0999e2bc318d6ae Mon Sep 17 00:00:00 2001 From: Antonin Portelli Date: Tue, 4 Mar 2014 17:16:36 +0000 Subject: [PATCH] more loop macros --- latan/Global.hpp | 4 +-- latan/StatArray.hpp | 69 ++++++++++++++++++++++++--------------------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/latan/Global.hpp b/latan/Global.hpp index db5d78e..83aa3c2 100644 --- a/latan/Global.hpp +++ b/latan/Global.hpp @@ -75,8 +75,8 @@ using Vec = Mat; typedef Vec IVec; typedef Vec DVec; -#define FOR_VEC(vec, i) \ -for (Latan::Index i = 0; i < (vec).size(); ++i) +#define FOR_VEC(vec, i) for (Latan::Index i = 0; i < (vec).size(); ++i) +#define FOR_ARRAY(ar, i) FOR_VEC(ar, i) // block types template diff --git a/latan/StatArray.hpp b/latan/StatArray.hpp index dc255eb..ce91c6f 100644 --- a/latan/StatArray.hpp +++ b/latan/StatArray.hpp @@ -24,12 +24,15 @@ #include #include +#define FOR_STAT_ARRAY(ar, i) \ +for (Latan::Index i = -(ar).offset; i < (ar).size(); ++i) + BEGIN_NAMESPACE /****************************************************************************** * Array class with statistics * ******************************************************************************/ -template +template class StatArray: public Array { private: @@ -38,7 +41,7 @@ public: // constructors StatArray(void); explicit StatArray(const Index size); - EIGEN_EXPR_CTOR(StatArray, unique_arg(StatArray), Base, + EIGEN_EXPR_CTOR(StatArray, unique_arg(StatArray), Base, ArrayBase) // destructor virtual ~StatArray(void) = default; @@ -53,6 +56,8 @@ public: T mean(void) const; T variance(const Index pos, const Index n) const; T variance(void) const; +public: + static const Index offset = os; }; // reduction operations @@ -70,40 +75,40 @@ namespace ReducOp * StatArray class template implementation * ******************************************************************************/ // constructors //////////////////////////////////////////////////////////////// -template -StatArray::StatArray(void) -: Base(static_cast(offset)) +template +StatArray::StatArray(void) +: Base(static_cast(os)) {} -template -StatArray::StatArray(const Index size) -: Base(static_cast(size + offset)) +template +StatArray::StatArray(const Index size) +: Base(static_cast(size + os)) {} // access ////////////////////////////////////////////////////////////////////// -template -Index StatArray::size(void) const +template +Index StatArray::size(void) const { - return Base::size() - offset; + return Base::size() - os; } // operators /////////////////////////////////////////////////////////////////// -template -T & StatArray::operator[](const Index s) +template +T & StatArray::operator[](const Index s) { - return Base::operator[](s + offset); + return Base::operator[](s + os); } -template -const T & StatArray::operator[](const Index s) const +template +const T & StatArray::operator[](const Index s) const { - return Base::operator[](s + offset); + return Base::operator[](s + os); } // statistics ////////////////////////////////////////////////////////////////// -template -void StatArray::bin(Index binSize) +template +void StatArray::bin(Index binSize) { Index q = size()/binSize, r = size()%binSize; @@ -114,42 +119,42 @@ void StatArray::bin(Index binSize) if (r != 0) { (*this)[q] = mean(q*binSize, r); - this->conservativeResize(offset + q + 1); + this->conservativeResize(os + q + 1); } else { - this->conservativeResize(offset + q); + this->conservativeResize(os + q); } } -template -T StatArray::mean(const Index pos, const Index n) const +template +T StatArray::mean(const Index pos, const Index n) const { T result; if (n) { - result = this->segment(pos+offset, n).redux(&ReducOp::sum); + result = this->segment(pos+os, n).redux(&ReducOp::sum); } return result/static_cast(n); } -template -T StatArray::mean(void) const +template +T StatArray::mean(void) const { return mean(0, size()); } -template -T StatArray::variance(const Index pos, const Index n) const +template +T StatArray::variance(const Index pos, const Index n) const { T s, sqs, result; if (n) { - s = this->segment(pos+offset, n).redux(&ReducOp::sum); - sqs = this->segment(pos+offset, n).unaryExpr(&ReducOp::square) + s = this->segment(pos+os, n).redux(&ReducOp::sum); + sqs = this->segment(pos+os, n).unaryExpr(&ReducOp::square) .redux(&ReducOp::sum); result = sqs - ReducOp::square(s)/static_cast(n); } @@ -157,8 +162,8 @@ T StatArray::variance(const Index pos, const Index n) const return result/static_cast(n - 1); } -template -T StatArray::variance(void) const +template +T StatArray::variance(void) const { return variance(0, size()); }