7 #include <KrisLibrary/utils/IntTuple.h> 24 ArrayND(
int dim1,
int dim2,
int dim3);
25 ArrayND(
const std::vector<int>& dims);
29 inline size_t numDims()
const {
return dims.size(); }
30 inline size_t numValues()
const {
return values.size(); }
31 inline const std::vector<int>& size()
const {
return dims; }
34 void resize(
const std::vector<int>& newdims);
40 inline void set(T val) { std::fill(values.begin(),values.end(),val); }
43 const ArrayND<T>& operator = (
const std::vector<T>& rhs);
47 bool operator == (
const ArrayND<T>& rhs)
const;
49 T& operator [] (
const std::vector<int>& index);
50 const T& operator [] (
const std::vector<int>& index)
const;
51 inline T& operator [] (
const IntTuple& index) {
return operator [](index.elements); }
52 inline const T& operator [] (
const IntTuple& index)
const {
return operator [](index.elements); }
54 void getSubArray(
const std::vector<int>& imin,
const std::vector<int>& imax,
ArrayND<T>& subArray)
const;
55 void setSubArray(
const std::vector<int>& imin,
const std::vector<int>& imax,
const ArrayND<T>& subArray);
56 void getSlice(
const std::vector<int>& dimIndices,
ArrayND<T>& slice)
const;
57 void setSlice(
const std::vector<int>& dimIndices,
const ArrayND<T>& slice);
59 int indexToOffset(
const std::vector<int>& index)
const;
60 inline void indexToOffset(
const IntTuple& index)
const {
return indexToOffset(index.elements); }
61 inline int incOffset(
int offset,
int dim)
const {
return offset+strides[dim]; }
62 inline int decOffset(
int offset,
int dim)
const {
return offset-strides[dim]; }
63 std::vector<int> offsetToIndex(
int offset)
const;
72 void inc(
int dim,
int count);
74 void dec(
int dim,
int count);
75 inline bool operator == (
const iterator& it)
const {
return it.obj == obj && it.offset == offset; }
76 inline bool operator != (
const iterator& it)
const {
return !operator == (it); }
77 inline bool operator < (
const iterator& it)
const {
return it.obj == obj && it.offset > offset; }
78 inline bool operator > (
const iterator& it)
const {
return it.obj == obj && it.offset < offset; }
79 inline int operator - (
const iterator& it)
const { assert(it.obj == obj);
return offset-it.offset; }
80 inline T& operator * () {
81 assert(offset >= 0 && offset<obj->values.size());
82 return obj->values[offset];
84 inline T* operator -> () {
85 assert(offset >= 0 && offset<obj->values.size());
86 return &obj->values[offset];
90 std::vector<int> index;
95 iterator begin(
const std::vector<int>& index);
98 std::vector<int> dims;
99 std::vector<int> strides;
100 std::vector<T> values;
126 :dims(rhs.dims),strides(rhs.strides),values(rhs.values)
132 :dims(2),strides(2),values(rhs.getData(),rhs.getData()+rhs.m*rhs.n)
142 :dims(3),strides(3),values(rhs.getData(),rhs.getData()+rhs.m*rhs.n*rhs.p)
147 strides[0] = rhs.n*rhs.p;
193 if(newdims.empty()) {
199 for(
size_t i=0;i<newdims.size();i++)
202 strides.resize(dims.size());
203 strides[dims.size()-1] = 1;
204 for(
size_t i=dims.size()-1;i>0;i--)
205 strides[i-1] = dims[i]*strides[i];
212 strides = rhs.strides;
220 std::copy(rhs.begin(),rhs.end(),values.begin());
227 std::copy(rhs.getData(),rhs.getData()+values.size(),values.begin());
233 resize(rhs.m,rhs.n,rhs.p);
234 std::copy(rhs.getData(),rhs.getData()+values.size(),values.begin());
240 if(dims != rhs.dims)
return false;
241 if(values != rhs.values)
return false;
248 assert(!dims.empty());
249 int offset = i*strides[0];
257 int offset=indexToOffset(index);
258 for(
size_t i=0;i<index.size();i++)
259 assert(index[i] >= 0 && index[i] < dims[i]);
260 return values[offset];
266 int offset=indexToOffset(index);
267 for(
size_t i=0;i<index.size();i++)
268 assert(index[i] >= 0 && index[i] < dims[i]);
269 return values[offset];
286 assert(index.size()==strides.size());
288 for(
size_t i=0;i<index.size();i++)
289 offset += index[i]*strides[i];
296 std::vector<int> index(strides.size());
297 for(
size_t i=0;i<index.size();i++) {
298 index[i] = offset/strides[i];
299 offset = offset%strides[i];
310 res.index.resize(dims.size(),0);
319 res.offset = indexToOffset(index);
329 res.offset = int(values.size());
330 res.index.resize(dims.size(),0);
331 res.index[0] = dims[0];
342 for(
int i=(
int)index.size()-1;i>=0;i--) {
344 if(index[i]==obj->dims[i])
347 assert(index[i] < obj->dims[i]);
358 for(
int i=(
int)index.size()-1;i>=0;i--) {
361 index[i] = obj->dims[i]-1;
363 assert(index[i] >= 0);
374 for(
int i=(
int)index.size()-1;i>=0;i--) {
376 if(index[i] < obj->dims[i])
break;
377 assert(obj->dims[i] > 0);
378 skip = index[i]/obj->dims[i];
379 index[i]=index[i]%obj->dims[i];
388 for(
int i=(
int)index.size()-1;i>=0;i--) {
390 if(index[i] >=0)
break;
392 assert(obj->dims[i] > 0);
394 while(index[i] < 0) {
396 index[i]+=obj->dims[i];
405 assert(dim >= 0 && dim < (
int)index.size());
407 offset += obj->strides[dim];
413 assert(dim >= 0 && dim < (
int)index.size());
415 offset += count*obj->strides[dim];
421 assert(dim >= 0 && dim < (
int)index.size());
423 offset -= obj->strides[dim];
429 assert(dim >= 0 && dim < (
int)index.size());
431 offset -= count*obj->strides[dim];
437 :obj(NULL),offset(0),curDim(0)
442 :obj(rhs.obj),offset(rhs.offset),curDim(rhs.curDim)
447 :obj(_obj),offset(_offset),curDim(_curDim)
453 assert(curDim+1 == (
int)obj->dims.size());
454 obj->values[offset] = val;
461 assert(curDim+val.dims.size() == (int)obj->dims.size());
462 LOG4CXX_ERROR(KrisLibrary::logger(),
"TODO: copy slices\n");
470 assert(curDim+1 == (
int)obj->dims.size());
471 return obj->values[offset];
477 assert(curDim+1 < (
int)obj->dims.size());
478 return ArrayNDRef<T>(obj,offset+obj->strides[curDim+1]*i,curDim+1);
An integer tuple class.
Definition: IntTuple.h:14
void resize(const std::vector< int > &newdims)
note: resize is destructive
Definition: arraynd.h:191
A two-dimensional m x n array.
Definition: array2d.h:30
void copy(const T &a, T *out, int n)
Definition: arrayutils.h:34
The logging system used in KrisLibrary.
A three-dimensional m x n x parray.
Definition: array3d.h:31