7 #include <KrisLibrary/utils/IntTuple.h> 26 ArrayND(
int dim1,
int dim2,
int dim3);
27 ArrayND(
const std::vector<int>& dims);
31 inline size_t numDims()
const {
return dims.size(); }
32 inline size_t numValues()
const {
return values.size(); }
33 inline const std::vector<int>& size()
const {
return dims; }
36 void resize(
const std::vector<int>& newdims);
42 inline void set(T val) { std::fill(values.begin(),values.end(),val); }
45 const ArrayND<T>& operator = (
const std::vector<T>& rhs);
49 bool operator == (
const ArrayND<T>& rhs)
const;
51 T& operator [] (
const std::vector<int>& index);
52 const T& operator [] (
const std::vector<int>& index)
const;
53 inline T& operator [] (
const IntTuple& index) {
return operator [](index.elements); }
54 inline const T& operator [] (
const IntTuple& index)
const {
return operator [](index.elements); }
56 void getSubArray(
const std::vector<int>& imin,
const std::vector<int>& imax,
ArrayND<T>& subArray)
const;
57 void setSubArray(
const std::vector<int>& imin,
const std::vector<int>& imax,
const ArrayND<T>& subArray);
58 void getSlice(
const std::vector<int>& dimIndices,
ArrayND<T>& slice)
const;
59 void setSlice(
const std::vector<int>& dimIndices,
const ArrayND<T>& slice);
61 int indexToOffset(
const std::vector<int>& index)
const;
62 inline void indexToOffset(
const IntTuple& index)
const {
return indexToOffset(index.elements); }
63 inline int incOffset(
int offset,
int dim)
const {
return offset+strides[dim]; }
64 inline int decOffset(
int offset,
int dim)
const {
return offset-strides[dim]; }
65 std::vector<int> offsetToIndex(
int offset)
const;
74 void inc(
int dim,
int count);
76 void dec(
int dim,
int count);
77 inline bool operator == (
const iterator& it)
const {
return it.obj == obj && it.offset == offset; }
78 inline bool operator != (
const iterator& it)
const {
return !operator == (it); }
79 inline bool operator < (
const iterator& it)
const {
return it.obj == obj && it.offset > offset; }
80 inline bool operator > (
const iterator& it)
const {
return it.obj == obj && it.offset < offset; }
81 inline int operator - (
const iterator& it)
const { assert(it.obj == obj);
return offset-it.offset; }
82 inline T& operator * () {
83 assert(offset >= 0 && offset<obj->values.size());
84 return obj->values[offset];
86 inline T* operator -> () {
87 assert(offset >= 0 && offset<obj->values.size());
88 return &obj->values[offset];
92 std::vector<int> index;
97 iterator begin(
const std::vector<int>& index);
100 std::vector<int> dims;
101 std::vector<int> strides;
102 std::vector<T> values;
123 std::ostream& operator <<(std::ostream& out,const ArrayND<T>& array)
125 out<<array.dims.size()<<
'\t';
126 for(
size_t i=0;i<array.dims.size();i++)
127 out<<array.dims[i]<<
" ";
129 for(
size_t i=0;i<array.values.size();i++)
130 out<<array.values[i]<<std::endl;
135 std::istream& operator >>(std::istream& in,
ArrayND<T>& array)
137 std::vector<int> dims;
140 if(!in || n < 0) { in.setstate(std::ios::badbit);
return in; }
142 for(
size_t i=0;i<dims.size();i++) {
144 if(dims[i] < 0) { in.setstate(std::ios::badbit);
return in; }
147 for(
size_t i=0;i<array.values.size();i++)
160 :dims(rhs.dims),strides(rhs.strides),values(rhs.values)
166 :dims(2),strides(2),values(rhs.getData(),rhs.getData()+rhs.m*rhs.n)
176 :dims(3),strides(3),values(rhs.getData(),rhs.getData()+rhs.m*rhs.n*rhs.p)
181 strides[0] = rhs.n*rhs.p;
227 if(newdims.empty()) {
233 for(
size_t i=0;i<newdims.size();i++)
236 strides.resize(dims.size());
237 strides[dims.size()-1] = 1;
238 for(
size_t i=dims.size()-1;i>0;i--)
239 strides[i-1] = dims[i]*strides[i];
246 strides = rhs.strides;
255 std::copy(rhs.begin(),rhs.end(),values.begin());
263 std::copy(rhs.getData(),rhs.getData()+values.size(),values.begin());
270 resize(rhs.m,rhs.n,rhs.p);
271 std::copy(rhs.getData(),rhs.getData()+values.size(),values.begin());
278 if(dims != rhs.dims)
return false;
279 if(values != rhs.values)
return false;
286 assert(!dims.empty());
287 int offset = i*strides[0];
295 int offset=indexToOffset(index);
296 for(
size_t i=0;i<index.size();i++)
297 assert(index[i] >= 0 && index[i] < dims[i]);
298 return values[offset];
304 int offset=indexToOffset(index);
305 for(
size_t i=0;i<index.size();i++)
306 assert(index[i] >= 0 && index[i] < dims[i]);
307 return values[offset];
324 assert(index.size()==strides.size());
326 for(
size_t i=0;i<index.size();i++)
327 offset += index[i]*strides[i];
334 std::vector<int> index(strides.size());
335 for(
size_t i=0;i<index.size();i++) {
336 index[i] = offset/strides[i];
337 offset = offset%strides[i];
348 res.index.resize(dims.size(),0);
357 res.offset = indexToOffset(index);
367 res.offset = int(values.size());
368 res.index.resize(dims.size(),0);
369 res.index[0] = dims[0];
380 for(
int i=(
int)index.size()-1;i>=0;i--) {
382 if(index[i]==obj->dims[i])
385 assert(index[i] < obj->dims[i]);
396 for(
int i=(
int)index.size()-1;i>=0;i--) {
399 index[i] = obj->dims[i]-1;
401 assert(index[i] >= 0);
412 for(
int i=(
int)index.size()-1;i>=0;i--) {
414 if(index[i] < obj->dims[i])
break;
415 assert(obj->dims[i] > 0);
416 skip = index[i]/obj->dims[i];
417 index[i]=index[i]%obj->dims[i];
426 for(
int i=(
int)index.size()-1;i>=0;i--) {
428 if(index[i] >=0)
break;
430 assert(obj->dims[i] > 0);
432 while(index[i] < 0) {
434 index[i]+=obj->dims[i];
443 assert(dim >= 0 && dim < (
int)index.size());
445 offset += obj->strides[dim];
451 assert(dim >= 0 && dim < (
int)index.size());
453 offset += count*obj->strides[dim];
459 assert(dim >= 0 && dim < (
int)index.size());
461 offset -= obj->strides[dim];
467 assert(dim >= 0 && dim < (
int)index.size());
469 offset -= count*obj->strides[dim];
475 :obj(NULL),offset(0),curDim(0)
480 :obj(rhs.obj),offset(rhs.offset),curDim(rhs.curDim)
485 :obj(_obj),offset(_offset),curDim(_curDim)
491 assert(curDim+1 == (
int)obj->dims.size());
492 obj->values[offset] = val;
499 assert(curDim+val.dims.size() == (int)obj->dims.size());
500 LOG4CXX_ERROR(KrisLibrary::logger(),
"TODO: copy slices\n");
508 assert(curDim+1 == (
int)obj->dims.size());
509 return obj->values[offset];
515 assert(curDim+1 < (
int)obj->dims.size());
516 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:225
A two-dimensional m x n array.
Definition: array2d.h:30
void copy(const T &a, T *out, int n)
Definition: arrayutils.h:34
An N-D array class.
Definition: arraynd.h:11
The logging system used in KrisLibrary.
A three-dimensional m x n x parray.
Definition: array3d.h:31