21template<
class T>
inline std::ostream&
22operator<< (std::ostream& os,
const T_minmax<T>& mm) {
23 return os <<
"[" << mm.min <<
", " << mm.max <<
"]";
26template<
class T>
inline static T
27_prod (
const T a,
const T b) {
return (a*b);}
28template<
class T>
inline static T
29prod (
const std::vector<T>& v) {
30 return std::accumulate(v.begin(), v.end(), (T)1, _prod<T>);
32template<
class T>
inline static T
33sum (
const std::vector<T>& v) {
34 return std::accumulate(v.begin(), v.end(), (T)0);
37minmax (
const std::vector<T>& v) {
39 for (
size_t i = 0; i < v.size(); ++i){
40 ret.min = std::min(ret.min,v[i]);
41 ret.max = std::max(ret.max,v[i]);
46const static std::string SLASH (
"/");
47const static std::string DSLASH (
"//");
84 NDData (
const size_t n0,
const size_t n1) {
98 NDData (
const size_t n0,
const size_t n1,
const size_t n2) {
113 NDData (
const size_t n0,
const size_t n1,
const size_t n2,
const size_t n3) {
127 NDData (
const std::vector<hsize_t>& dims) {
128 _dims.resize(dims.size());
129 std::reverse_copy (dims.begin(), dims.end(),
_dims.begin());
138 NDData (
const std::vector<size_t>& dims) {
166 inline size_t Dim (
const size_t n = 0)
const {
return _dims[n]; }
168 inline std::vector<size_t> Dims ()
const {
return _dims; }
170 inline size_t Size ()
const {
return _data.size(); }
172 inline size_t NDim()
const {
return _dims.size(); }
174 std::ostream& Print (std::ostream& os)
const {
176 for (
size_t i = 0; i <
_dims.size(); ++i)
177 os <<
_dims[i] <<
" ";
178 os <<
") range(" << minmax(
_data) <<
")";
182 inline bool Empty ()
const {
return _data.empty(); }
184 inline T& operator[] (
const size_t p) {
return _data[p]; }
186 inline T operator[] (
const size_t p)
const {
return _data[p]; }
188 inline T& operator() (
const size_t p) {
return _data[p]; }
190 inline T operator() (
const size_t p)
const {
return _data[p]; }
192 inline T& operator() (
const size_t n0,
const size_t n1)
193 {
return _data[n1*Dim(0)+n0]; }
195 inline T operator() (
const size_t n0,
const size_t n1)
const
196 {
return _data[n1*Dim(0)+n0]; }
198 inline T& operator() (
const size_t n0,
const size_t n1,
const size_t n2) {
199 return _data[n2*Dim(0)*Dim(1)+n1*Dim(0)+n0];
202 inline T operator() (
const size_t n0,
const size_t n1,
const size_t n2)
const {
203 return _data[n2*Dim(0)*Dim(1)+n1*Dim(0)+n0];
206 inline T& operator () (
const size_t n0,
const size_t n1,
const size_t n2,
const size_t n3) {
207 return _data[n3 * Dim(2) * Dim(1) * Dim(0) +
208 n2 * Dim(1) * Dim(0) + n1 * Dim(0) + n0];
211 inline T operator () (
const size_t n0,
const size_t n1,
const size_t n2,
const size_t n3)
const {
212 return _data[n3 * Dim(2) * Dim(1) * Dim(0) +
213 n2 * Dim(1) * Dim(0) + n1 * Dim(0) + n0];
217 inline const T* Ptr (
const size_t n = 0)
const {
return &
_data[n]; }
219 inline T* Ptr (
const size_t n = 0) {
return &
_data[n]; }
221 inline std::vector<T> Data ()
const {
return _data; }
226template <
class T>
inline static NDData<T>
228 std::vector<T>& times = std::vector<T>(),
229 std::vector<size_t> meta = std::vector<size_t>()) {
231 if (!(times.empty()))
232 assert (times.size() == data.Dim(0));
234 times = std::vector<T> (data.Dim(0),1.);
237 assert (meta.size() == data.Dim(0));
239 meta = std::vector<size_t> (data.Dim(0),0);
242 size_t ncol = ret.Size()/ret.Dim(0);
243 size_t csz = ret.Dim(0);
245 for (
size_t i = 0, os = i*csz; i < ncol; ++i)
246 for (
size_t j = 1; j < csz; ++j) {
247 if (check_bit(meta[j], REFOCUS_T))
248 ret[os+j] = - ret[os+j-1];
249 else if (check_bit(meta[j], EXCITE_T))
252 ret[os+j] = ret[os+j-1];
253 ret[os+j] += .5 * (data[os+j] + data[os+j-1]) * (times[os+j] - times[os+j-1]);
261template <
class T>
inline static bool
263 return data.Dims().size() == 2;
266template <
class T>
inline static NDData<T>
268 assert (ismatrix(data));
270 for (
size_t j = 0; j < data.Dim(1); ++j)
271 for (
size_t i = 0; i < data.Dim(0); i++)
272 ret(j,i) = data(i,j);
277template <
class T>
inline std::ostream&
278operator<< (std::ostream& os,
NDData<T>& di) {
Implementation of JEMRIS TPOI.
Simple nd-data structure.
Definition NDData.h:53
std::vector< size_t > _dims
Definition NDData.h:58
NDData(const size_t n0, const size_t n1, const size_t n2, const size_t n3)
4D-data (convenience constructor)
Definition NDData.h:113
NDData(const std::vector< hsize_t > &dims)
ND-Data.
Definition NDData.h:127
NDData(const NDData &data)
Copy constructor.
Definition NDData.h:148
NDData()
Default constructor.
Definition NDData.h:66
NDData(const std::vector< size_t > &dims)
ND-Data.
Definition NDData.h:138
std::vector< T > _data
Definition NDData.h:59
NDData(const size_t n0, const size_t n1, const size_t n2)
3D-data (convenience constructor)
Definition NDData.h:98
NDData(const size_t n0)
1D-data (convenience constructor)
Definition NDData.h:73
NDData & operator=(const NDData &data)
Assignement.
Definition NDData.h:157
NDData(const size_t n0, const size_t n1)
2D-data (convenience constructor)
Definition NDData.h:84