00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00031 #ifndef matpackV_h
00032 #define matpackV_h
00033
00034 #include "matpackIV.h"
00035
00038 class Iterator5D {
00039 public:
00040
00041
00042
00043
00045 Iterator5D() : msv(), mstride(0) { }
00046
00048 Iterator5D(const Iterator5D& o) : msv(o.msv), mstride(o.mstride)
00049 { }
00050
00052 Iterator5D(const Tensor4View& x, Index stride) : msv(x), mstride(stride)
00053 { }
00054
00055
00057 Iterator5D& operator++() { msv.mdata += mstride; return *this; }
00058
00060 bool operator!=(const Iterator5D& other) const
00061 { if ( msv.mdata +
00062 msv.mbr.mstart +
00063 msv.mpr.mstart +
00064 msv.mrr.mstart +
00065 msv.mcr.mstart
00066 !=
00067 other.msv.mdata +
00068 other.msv.mbr.mstart +
00069 other.msv.mpr.mstart +
00070 other.msv.mrr.mstart +
00071 other.msv.mcr.mstart )
00072 return true;
00073 else
00074 return false;
00075 }
00076
00079 Tensor4View* operator->() { return &msv; }
00080
00082 Tensor4View& operator*() { return msv; }
00083
00084 private:
00086 Tensor4View msv;
00088 Index mstride;
00089 };
00090
00092 class ConstIterator5D {
00093 public:
00094
00096 ConstIterator5D() : msv(), mstride(0) { }
00097
00099 ConstIterator5D(const ConstIterator5D& o) : msv(o.msv), mstride(o.mstride)
00100 { }
00101
00103 ConstIterator5D(const ConstTensor4View& x, Index stride)
00104 : msv(x), mstride(stride)
00105 { }
00106
00107
00109 ConstIterator5D& operator++() { msv.mdata += mstride; return *this; }
00110
00112 bool operator!=(const ConstIterator5D& other) const
00113 { if ( msv.mdata +
00114 msv.mbr.mstart +
00115 msv.mpr.mstart +
00116 msv.mrr.mstart +
00117 msv.mcr.mstart
00118 !=
00119 other.msv.mdata +
00120 other.msv.mbr.mstart +
00121 other.msv.mpr.mstart +
00122 other.msv.mrr.mstart +
00123 other.msv.mcr.mstart )
00124 return true;
00125 else
00126 return false;
00127 }
00128
00131 const ConstTensor4View* operator->() const { return &msv; }
00132
00134 const ConstTensor4View& operator*() const { return msv; }
00135
00136 private:
00138 ConstTensor4View msv;
00140 Index mstride;
00141 };
00142
00143
00144
00145 class Tensor5;
00146
00147
00160 class ConstTensor5View {
00161 public:
00162
00163 Index nshelves() const;
00164 Index nbooks() const;
00165 Index npages() const;
00166 Index nrows() const;
00167 Index ncols() const;
00168
00169
00170 ConstTensor5View operator()( const Range& s, const Range& b, const Range& p, const Range& r, const Range& c ) const;
00171
00172 ConstTensor4View operator()( const Range& s, const Range& b, const Range& p, const Range& r, Index c ) const;
00173 ConstTensor4View operator()( const Range& s, const Range& b, const Range& p, Index r, const Range& c ) const;
00174 ConstTensor4View operator()( const Range& s, const Range& b, Index p, const Range& r, const Range& c ) const;
00175 ConstTensor4View operator()( const Range& s, Index b, const Range& p, const Range& r, const Range& c ) const;
00176 ConstTensor4View operator()( Index s, const Range& b, const Range& p, const Range& r, const Range& c ) const;
00177
00178 ConstTensor3View operator()( const Range& s, const Range& b, const Range& p, Index r, Index c ) const;
00179 ConstTensor3View operator()( const Range& s, const Range& b, Index p, const Range& r, Index c ) const;
00180 ConstTensor3View operator()( const Range& s, const Range& b, Index p, Index r, const Range& c ) const;
00181 ConstTensor3View operator()( const Range& s, Index b, const Range& p, Index r, const Range& c ) const;
00182 ConstTensor3View operator()( const Range& s, Index b, const Range& p, const Range& r, Index c ) const;
00183 ConstTensor3View operator()( const Range& s, Index b, Index p, const Range& r, const Range& c ) const;
00184 ConstTensor3View operator()( Index s, const Range& b, Index p, const Range& r, const Range& c ) const;
00185 ConstTensor3View operator()( Index s, const Range& b, const Range& p, Index r, const Range& c ) const;
00186 ConstTensor3View operator()( Index s, const Range& b, const Range& p, const Range& r, Index c ) const;
00187 ConstTensor3View operator()( Index s, Index b, const Range& p, const Range& r, const Range& c ) const;
00188
00189 ConstMatrixView operator()( const Range& s, const Range& b, Index p, Index r, Index c ) const;
00190 ConstMatrixView operator()( const Range& s, Index b, const Range& p, Index r, Index c ) const;
00191 ConstMatrixView operator()( const Range& s, Index b, Index p, const Range& r, Index c ) const;
00192 ConstMatrixView operator()( const Range& s, Index b, Index p, Index r, const Range& c ) const;
00193 ConstMatrixView operator()( Index s, const Range& b, Index p, Index r, const Range& c ) const;
00194 ConstMatrixView operator()( Index s, const Range& b, Index p, const Range& r, Index c ) const;
00195 ConstMatrixView operator()( Index s, const Range& b, const Range& p, Index r, Index c ) const;
00196 ConstMatrixView operator()( Index s, Index b, const Range& p, const Range& r, Index c ) const;
00197 ConstMatrixView operator()( Index s, Index b, const Range& p, Index r, const Range& c ) const;
00198 ConstMatrixView operator()( Index s, Index b, Index p, const Range& r, const Range& c ) const;
00199
00200 ConstVectorView operator()( const Range& s, Index b, Index p, Index r, Index c ) const;
00201 ConstVectorView operator()( Index s, const Range& b, Index p, Index r, Index c ) const;
00202 ConstVectorView operator()( Index s, Index b, const Range& p, Index r, Index c ) const;
00203 ConstVectorView operator()( Index s, Index b, Index p, const Range& r, Index c ) const;
00204 ConstVectorView operator()( Index s, Index b, Index p, Index r, const Range& c ) const;
00205
00207 Numeric operator()(Index s, Index b, Index p, Index r, Index c) const
00208 {
00209 assert( 0 <= s );
00210 assert( 0 <= b );
00211 assert( 0 <= p );
00212 assert( 0 <= r );
00213 assert( 0 <= c );
00214 assert( s < msr.mextent );
00215 assert( b < mbr.mextent );
00216 assert( p < mpr.mextent );
00217 assert( r < mrr.mextent );
00218 assert( c < mcr.mextent );
00219
00220 return *( mdata +
00221 msr.mstart + s * msr.mstride +
00222 mbr.mstart + b * mbr.mstride +
00223 mpr.mstart + p * mpr.mstride +
00224 mrr.mstart + r * mrr.mstride +
00225 mcr.mstart + c * mcr.mstride );
00226 }
00227
00228
00229 ConstIterator5D begin() const;
00230 ConstIterator5D end() const;
00231
00233 virtual ~ConstTensor5View() {};
00234
00235
00236 friend class Tensor5View;
00237 friend class ConstIterator6D;
00238 friend class ConstTensor6View;
00239 friend class ConstTensor7View;
00240
00241
00242 ConstTensor5View(const ConstTensor4View& a);
00243
00244 protected:
00245
00246 ConstTensor5View();
00247 ConstTensor5View(Numeric *data,
00248 const Range& s, const Range& b, const Range& p, const Range& r, const Range& c);
00249 ConstTensor5View(Numeric *data,
00250 const Range& ps, const Range& pb, const Range& pp, const Range& pr, const Range& pc,
00251 const Range& ns, const Range& nb, const Range& np, const Range& nr, const Range& nc);
00252
00253
00254
00256 Range msr;
00258 Range mbr;
00260 Range mpr;
00262 Range mrr;
00264 Range mcr;
00266 Numeric *mdata;
00267 };
00268
00278 class Tensor5View : public ConstTensor5View {
00279 public:
00280
00281
00282 ConstTensor5View operator()( const Range& s, const Range& b, const Range& p, const Range& r, const Range& c ) const;
00283
00284 ConstTensor4View operator()( const Range& s, const Range& b, const Range& p, const Range& r, Index c ) const;
00285 ConstTensor4View operator()( const Range& s, const Range& b, const Range& p, Index r, const Range& c ) const;
00286 ConstTensor4View operator()( const Range& s, const Range& b, Index p, const Range& r, const Range& c ) const;
00287 ConstTensor4View operator()( const Range& s, Index b, const Range& p, const Range& r, const Range& c ) const;
00288 ConstTensor4View operator()( Index s, const Range& b, const Range& p, const Range& r, const Range& c ) const;
00289
00290 ConstTensor3View operator()( const Range& s, const Range& b, const Range& p, Index r, Index c ) const;
00291 ConstTensor3View operator()( const Range& s, const Range& b, Index p, const Range& r, Index c ) const;
00292 ConstTensor3View operator()( const Range& s, const Range& b, Index p, Index r, const Range& c ) const;
00293 ConstTensor3View operator()( const Range& s, Index b, const Range& p, Index r, const Range& c ) const;
00294 ConstTensor3View operator()( const Range& s, Index b, const Range& p, const Range& r, Index c ) const;
00295 ConstTensor3View operator()( const Range& s, Index b, Index p, const Range& r, const Range& c ) const;
00296 ConstTensor3View operator()( Index s, const Range& b, Index p, const Range& r, const Range& c ) const;
00297 ConstTensor3View operator()( Index s, const Range& b, const Range& p, Index r, const Range& c ) const;
00298 ConstTensor3View operator()( Index s, const Range& b, const Range& p, const Range& r, Index c ) const;
00299 ConstTensor3View operator()( Index s, Index b, const Range& p, const Range& r, const Range& c ) const;
00300
00301 ConstMatrixView operator()( const Range& s, const Range& b, Index p, Index r, Index c ) const;
00302 ConstMatrixView operator()( const Range& s, Index b, const Range& p, Index r, Index c ) const;
00303 ConstMatrixView operator()( const Range& s, Index b, Index p, const Range& r, Index c ) const;
00304 ConstMatrixView operator()( const Range& s, Index b, Index p, Index r, const Range& c ) const;
00305 ConstMatrixView operator()( Index s, const Range& b, Index p, Index r, const Range& c ) const;
00306 ConstMatrixView operator()( Index s, const Range& b, Index p, const Range& r, Index c ) const;
00307 ConstMatrixView operator()( Index s, const Range& b, const Range& p, Index r, Index c ) const;
00308 ConstMatrixView operator()( Index s, Index b, const Range& p, const Range& r, Index c ) const;
00309 ConstMatrixView operator()( Index s, Index b, const Range& p, Index r, const Range& c ) const;
00310 ConstMatrixView operator()( Index s, Index b, Index p, const Range& r, const Range& c ) const;
00311
00312 ConstVectorView operator()( const Range& s, Index b, Index p, Index r, Index c ) const;
00313 ConstVectorView operator()( Index s, const Range& b, Index p, Index r, Index c ) const;
00314 ConstVectorView operator()( Index s, Index b, const Range& p, Index r, Index c ) const;
00315 ConstVectorView operator()( Index s, Index b, Index p, const Range& r, Index c ) const;
00316 ConstVectorView operator()( Index s, Index b, Index p, Index r, const Range& c ) const;
00317
00320 Numeric operator()(Index s, Index b, Index p, Index r, Index c) const
00321 { return ConstTensor5View::operator()(s,b,p,r,c); }
00322
00323
00324
00325 Tensor5View operator()( const Range& s, const Range& b, const Range& p, const Range& r, const Range& c );
00326
00327 Tensor4View operator()( const Range& s, const Range& b, const Range& p, const Range& r, Index c );
00328 Tensor4View operator()( const Range& s, const Range& b, const Range& p, Index r, const Range& c );
00329 Tensor4View operator()( const Range& s, const Range& b, Index p, const Range& r, const Range& c );
00330 Tensor4View operator()( const Range& s, Index b, const Range& p, const Range& r, const Range& c );
00331 Tensor4View operator()( Index s, const Range& b, const Range& p, const Range& r, const Range& c );
00332
00333 Tensor3View operator()( const Range& s, const Range& b, const Range& p, Index r, Index c );
00334 Tensor3View operator()( const Range& s, const Range& b, Index p, const Range& r, Index c );
00335 Tensor3View operator()( const Range& s, const Range& b, Index p, Index r, const Range& c );
00336 Tensor3View operator()( const Range& s, Index b, const Range& p, Index r, const Range& c );
00337 Tensor3View operator()( const Range& s, Index b, const Range& p, const Range& r, Index c );
00338 Tensor3View operator()( const Range& s, Index b, Index p, const Range& r, const Range& c );
00339 Tensor3View operator()( Index s, const Range& b, Index p, const Range& r, const Range& c );
00340 Tensor3View operator()( Index s, const Range& b, const Range& p, Index r, const Range& c );
00341 Tensor3View operator()( Index s, const Range& b, const Range& p, const Range& r, Index c );
00342 Tensor3View operator()( Index s, Index b, const Range& p, const Range& r, const Range& c );
00343
00344 MatrixView operator()( const Range& s, const Range& b, Index p, Index r, Index c );
00345 MatrixView operator()( const Range& s, Index b, const Range& p, Index r, Index c );
00346 MatrixView operator()( const Range& s, Index b, Index p, const Range& r, Index c );
00347 MatrixView operator()( const Range& s, Index b, Index p, Index r, const Range& c );
00348 MatrixView operator()( Index s, const Range& b, Index p, Index r, const Range& c );
00349 MatrixView operator()( Index s, const Range& b, Index p, const Range& r, Index c );
00350 MatrixView operator()( Index s, const Range& b, const Range& p, Index r, Index c );
00351 MatrixView operator()( Index s, Index b, const Range& p, const Range& r, Index c );
00352 MatrixView operator()( Index s, Index b, const Range& p, Index r, const Range& c );
00353 MatrixView operator()( Index s, Index b, Index p, const Range& r, const Range& c );
00354
00355 VectorView operator()( const Range& s, Index b, Index p, Index r, Index c );
00356 VectorView operator()( Index s, const Range& b, Index p, Index r, Index c );
00357 VectorView operator()( Index s, Index b, const Range& p, Index r, Index c );
00358 VectorView operator()( Index s, Index b, Index p, const Range& r, Index c );
00359 VectorView operator()( Index s, Index b, Index p, Index r, const Range& c );
00360
00362 Numeric& operator()(Index s, Index b, Index p, Index r, Index c)
00363 {
00364 assert( 0 <= s );
00365 assert( 0 <= b );
00366 assert( 0 <= p );
00367 assert( 0 <= r );
00368 assert( 0 <= c );
00369 assert( s < msr.mextent );
00370 assert( b < mbr.mextent );
00371 assert( p < mpr.mextent );
00372 assert( r < mrr.mextent );
00373 assert( c < mcr.mextent );
00374
00375 return *( mdata +
00376 msr.mstart + s * msr.mstride +
00377 mbr.mstart + b * mbr.mstride +
00378 mpr.mstart + p * mpr.mstride +
00379 mrr.mstart + r * mrr.mstride +
00380 mcr.mstart + c * mcr.mstride );
00381 }
00382
00383
00384 ConstIterator5D begin() const;
00385 ConstIterator5D end() const;
00386
00387 Iterator5D begin();
00388 Iterator5D end();
00389
00390
00391 Tensor5View& operator=(const ConstTensor5View& v);
00392 Tensor5View& operator=(const Tensor5View& v);
00393 Tensor5View& operator=(const Tensor5& v);
00394 Tensor5View& operator=(Numeric x);
00395
00396
00397 Tensor5View& operator*=(Numeric x);
00398 Tensor5View& operator/=(Numeric x);
00399 Tensor5View& operator+=(Numeric x);
00400 Tensor5View& operator-=(Numeric x);
00401
00402 Tensor5View& operator*=(const ConstTensor5View& x);
00403 Tensor5View& operator/=(const ConstTensor5View& x);
00404 Tensor5View& operator+=(const ConstTensor5View& x);
00405 Tensor5View& operator-=(const ConstTensor5View& x);
00406
00408 virtual ~Tensor5View() {};
00409
00410
00411
00412
00413
00414 friend class Iterator6D;
00415 friend class Tensor6View;
00416 friend class Tensor7View;
00417
00418
00419 Tensor5View(const Tensor4View& a);
00420
00421 protected:
00422
00423 Tensor5View();
00424 Tensor5View(Numeric *data,
00425 const Range& s, const Range& b, const Range& p, const Range& r, const Range& c);
00426 Tensor5View(Numeric *data,
00427 const Range& ps, const Range& pb, const Range& pp, const Range& pr, const Range& pc,
00428 const Range& ns, const Range& nb, const Range& np, const Range& nr, const Range& nc);
00429 };
00430
00439 class Tensor5 : public Tensor5View {
00440 public:
00441
00442 Tensor5();
00443 Tensor5(Index s, Index b, Index p, Index r, Index c);
00444 Tensor5(Index s, Index b, Index p, Index r, Index c, Numeric fill);
00445 Tensor5(const ConstTensor5View& v);
00446 Tensor5(const Tensor5& v);
00447
00448
00449 Tensor5& operator=(const Tensor5& x);
00450 Tensor5& operator=(Numeric x);
00451
00452
00453 void resize(Index s, Index b, Index p, Index r, Index c);
00454
00455
00456 virtual ~Tensor5();
00457 };
00458
00459
00460
00461
00462
00463 void copy(ConstIterator5D origin,
00464 const ConstIterator5D& end,
00465 Iterator5D target);
00466
00467 void copy(Numeric x,
00468 Iterator5D target,
00469 const Iterator5D& end);
00470
00471 void transform( Tensor5View y,
00472 double (&my_func)(double),
00473 ConstTensor5View x );
00474
00475 Numeric max(const ConstTensor5View& x);
00476
00477 Numeric min(const ConstTensor5View& x);
00478
00479 ostream& operator<<(ostream& os, const ConstTensor5View& v);
00480
00482
00483 #ifndef NDEBUG
00484
00485 Numeric debug_tensor5view_get_elem (Tensor5View& tv, Index s, Index b, Index p,
00486 Index r, Index c);
00487
00488 #endif
00490
00491 #endif // matpackV_h