26 #ifndef XMIPPCORE_CORE_MULTIDIM_ARRAY_BASE_H_ 27 #define XMIPPCORE_CORE_MULTIDIM_ARRAY_BASE_H_ 51 #define STARTINGX(v) ((v).xinit) 55 #define FINISHINGX(v) ((v).xinit + (int)(v).xdim - 1) 59 #define STARTINGY(v) ((v).yinit) 63 #define FINISHINGY(v) ((v).yinit + (int)(v).ydim - 1) 67 #define STARTINGZ(v) ((v).zinit) 71 #define FINISHINGZ(v) ((v).zinit + (int)(v).zdim - 1) 75 #define INSIDEX(v, x) ((x) >= STARTINGX(v) && (x) <= FINISHINGX(v)) 78 #define INSIDEY(v, y) ((y) >= STARTINGY(v) && (y) <= FINISHINGY(v)) 81 #define INSIDEZ(v, z) ((z) >= STARTINGZ(v) && (z) <= FINISHINGZ(v)) 84 #define INSIDEXY(v, x, y) (INSIDEX(v, x) && INSIDEY(v, y)) 87 #define INSIDEXYZ(v, x, y, z) (INSIDEX(v, x) && INSIDEY(v, y) && INSIDEZ(v,z)) 91 #define XSIZE(v) ((v).xdim) 95 #define YSIZE(v) ((v).ydim) 99 #define ZSIZE(v) ((v).zdim) 103 #define NSIZE(v) ((v).ndim) 107 #define YXSIZE(v) ((v).yxdim) 111 #define ZYXSIZE(v) ((v).zyxdim) 115 #define MULTIDIM_SIZE(v) ((v).nzyxdim) 119 #define NZYXSIZE(v) ((v).nzyxdim) 125 #ifndef MULTIDIM_ARRAY 126 #define MULTIDIM_ARRAY(v) ((v).data) 133 #define DIRECT_NZYX_ELEM(v, l, k, i, j) ((v).data[(l)*ZYXSIZE(v)+(k)*YXSIZE(v)+((i)*XSIZE(v))+(j)]) 139 #define DIRECT_ZYX_ELEM(v, k, i, j) ((v).data[(k)*YXSIZE(v)+((i)*XSIZE(v))+(j)]) 145 #define DIRECT_N_YX_ELEM(v, l, i, j) ((v).data[(l)*ZYXSIZE(v) +((i)*XSIZE(v))+(j)]) 150 #define DIRECT_N__X_ELEM(v, l, j) ((v).data[(l)*ZYXSIZE(v)+(j)]) 154 #define NZYX_ELEM(v, l, k, i, j) \ 155 DIRECT_NZYX_ELEM((v), (l), (k) - STARTINGZ(v), (i) - STARTINGY(v), (j) - STARTINGX(v)) 161 #define DIRECT_MULTIDIM_ELEM(v,n) ((v).data[(n)]) 176 #define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v) \ 177 for (size_t n=0; n<NZYXSIZE(v); ++n) 192 #define FOR_ALL_DIRECT_NZYX_ELEMENTS_IN_MULTIDIMARRAY(V) \ 193 for (size_t l=0; l<NSIZE(V); ++l) \ 194 for (size_t k=0; k<ZSIZE(V); ++k) \ 195 for (size_t i=0; i<YSIZE(V); ++i) \ 196 for (size_t j=0; j<XSIZE(V); ++j) 211 #define FOR_ALL_NZYX_ELEMENTS_IN_MULTIDIMARRAY(V) \ 212 for (size_t l=0; l<NSIZE(V); ++l) \ 213 for (int k=STARTINGZ(V); k<=FINISHINGZ(V); ++k) \ 214 for (int i=STARTINGY(V); i<=FINISHINGY(V); ++i) \ 215 for (int j=STARTINGX(V); j<=FINISHINGX(V); ++j) 233 #define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY_ptr(v,n,ptr) \ 234 for ((n)=0, (ptr)=(v).data; (n)<NZYXSIZE(v); ++(n), ++(ptr)) 239 #define DIRECT_A3D_ELEM(v,k,i,j) ((v).data[YXSIZE(v)*(k)+((i)*XSIZE(v))+(j)]) 244 #define dAkij(V, k, i, j) DIRECT_A3D_ELEM(V, k, i, j) 253 #define A3D_ELEM(V, k, i, j) \ 254 DIRECT_A3D_ELEM((V),(k) - STARTINGZ(V), (i) - STARTINGY(V), (j) - STARTINGX(V)) 269 #define FOR_ALL_ELEMENTS_IN_ARRAY3D(V) \ 270 for (int k=STARTINGZ(V); k<=FINISHINGZ(V); ++k) \ 271 for (int i=STARTINGY(V); i<=FINISHINGY(V); ++i) \ 272 for (int j=STARTINGX(V); j<=FINISHINGX(V); ++j) 298 #define FOR_ALL_ELEMENTS_IN_COMMON_IN_ARRAY3D(V1, V2) \ 299 ispduptmp0 = XMIPP_MAX(STARTINGZ(V1), STARTINGZ(V2)); \ 300 ispduptmp1 = XMIPP_MIN(FINISHINGZ(V1),FINISHINGZ(V2)); \ 301 ispduptmp2 = XMIPP_MAX(STARTINGY(V1), STARTINGY(V2)); \ 302 ispduptmp3 = XMIPP_MIN(FINISHINGY(V1),FINISHINGY(V2)); \ 303 ispduptmp4 = XMIPP_MAX(STARTINGX(V1), STARTINGX(V2)); \ 304 ispduptmp5 = XMIPP_MIN(FINISHINGX(V1),FINISHINGX(V2)); \ 305 for (int k=ispduptmp0; k<=ispduptmp1; ++k) \ 306 for (int i=ispduptmp2; i<=ispduptmp3; ++i) \ 307 for (int j=ispduptmp4; j<=ispduptmp5; ++j) 322 #define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(V) \ 323 for (size_t k=0; k<ZSIZE(V); ++k) \ 324 for (size_t i=0; i<YSIZE(V); ++i) \ 325 for (size_t j=0; j<XSIZE(V); ++j) 341 #define DIRECT_A2D_ELEM(v,i,j) ((v).data[(i)*(v).xdim+(j)]) 345 #define dAij(M, i, j) DIRECT_A2D_ELEM(M, i, j) 354 #define A2D_ELEM(v, i, j) \ 355 DIRECT_A2D_ELEM(v, (i) - STARTINGY(v), (j) - STARTINGX(v)) 362 #define SAME_SHAPE2D(v1, v2) \ 363 (XSIZE(v1) == XSIZE(v2) && \ 364 YSIZE(v1) == YSIZE(v2) && \ 365 STARTINGX(v1) == STARTINGX(v2) && \ 366 STARTINGY(v1) == STARTINGY(v2)) 368 #define SAME_SHAPE3D(v1, v2) \ 369 (XSIZE(v1) == XSIZE(v2) && \ 370 YSIZE(v1) == YSIZE(v2) && \ 371 ZSIZE(v1) == ZSIZE(v2) && \ 372 STARTINGX(v1) == STARTINGX(v2) && \ 373 STARTINGY(v1) == STARTINGY(v2) && \ 374 STARTINGZ(v1) == STARTINGZ(v2)) 390 #define FOR_ALL_ELEMENTS_IN_ARRAY2D(m) \ 391 for (int i=STARTINGY(m); i<=FINISHINGY(m); ++i) \ 392 for (int j=STARTINGX(m); j<=FINISHINGX(m); ++j) 414 #define FOR_ALL_ELEMENTS_IN_COMMON_IN_ARRAY2D(m1, m2) \ 415 ispduptmp2 = XMIPP_MAX(STARTINGY(m1), STARTINGY(m2)); \ 416 ispduptmp3 = XMIPP_MIN(FINISHINGY(m1), FINISHINGY(m2)); \ 417 ispduptmp4 = XMIPP_MAX(STARTINGX(m1), STARTINGX(m2)); \ 418 ispduptmp5 = XMIPP_MIN(FINISHINGX(m1), FINISHINGX(m2)); \ 419 for (int i=ispduptmp2; i<=ispduptmp3; ++i) \ 420 for (int j=ispduptmp4; j<=ispduptmp5; ++j) 445 #define FOR_ALL_ELEMENTS_IN_ARRAY3D_BETWEEN(corner1, corner2) \ 446 for (ZZ(r)=ZZ((corner1)); ZZ(r)<=ZZ((corner2)); ++ZZ(r)) \ 447 for (YY(r)=YY((corner1)); YY(r)<=YY((corner2)); ++YY(r)) \ 448 for (XX(r)=XX((corner1)); XX(r)<=XX((corner2)); ++XX(r)) 472 #define FOR_ALL_ELEMENTS_IN_ARRAY2D_BETWEEN(corner1, corner2) \ 473 for (YY(r)=YY((corner1)); YY(r)<=YY((corner2)); ++YY(r)) \ 474 for (XX(r)=XX((corner1)); XX(r)<=XX((corner2)); ++XX(r)) 493 #define FOR_ALL_ELEMENTS_IN_ARRAY1D_BETWEEN(corner1, corner2) \ 494 for (XX(r)=(int) XX((corner1)); XX(r)<=(int) XX((corner2)); ++XX(r)) 509 #define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY2D(m) \ 510 for (size_t i=0; i<YSIZE(m); ++i) \ 511 for (size_t j=0; j<XSIZE(m); ++j) 526 #define DIRECT_A1D_ELEM(v, i) ((v).data[(i)]) 530 #define dAi(v, i) DIRECT_A1D_ELEM(v, i) 539 #define A1D_ELEM(v, i) DIRECT_A1D_ELEM(v, (i) - ((v).xinit)) 554 #define FOR_ALL_ELEMENTS_IN_ARRAY1D(v) \ 555 for (int i=STARTINGX(v); i<=FINISHINGX(v); ++i) 575 #define FOR_ALL_ELEMENTS_IN_COMMON_IN_ARRAY1D(v1, v2) \ 576 ispduptmp4 = XMIPP_MAX(STARTINGX(v1), STARTINGX(v2)); \ 577 ispduptmp5 = XMIPP_MIN(FINISHINGX(v1), FINISHINGX(v2)); \ 578 for (int i=ispduptmp4; i<=ispduptmp5; ++i) 593 #define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v) \ 594 for (size_t i=0; i<v.xdim; ++i) 597 #define OUTSIDE(i,j) \ 598 ((j) < STARTINGX(*this) || (j) > FINISHINGX(*this) || \ 599 (i) < STARTINGY(*this) || (i) > FINISHINGY(*this)) 602 #define OUTSIDE3D(k, i,j) \ 603 ((j) < STARTINGX(*this) || (j) > FINISHINGX(*this) || \ 604 (i) < STARTINGY(*this) || (i) > FINISHINGY(*this) || \ 605 (k) < STARTINGZ(*this) || (k) > FINISHINGZ(*this)) 609 #define LOOKUP_TABLE_LEN 6 662 virtual void clear() = 0;
668 virtual void maxIndex(
size_t &lmax,
int& kmax,
int& imax,
int& jmax)
const = 0;
709 void setDimensions(
int Xdim,
int Ydim,
int Zdim,
size_t Ndim);
718 void getDimensions(
size_t& Xdim,
size_t& Ydim,
size_t& Zdim,
size_t &Ndim)
const;
752 virtual void resize(
size_t Ndim,
size_t Zdim,
size_t Ydim,
size_t Xdim,
bool copy=
true) = 0;
761 void resize(
size_t Zdim,
size_t Ydim,
size_t Xdim)
763 resize(1, Zdim, Ydim, Xdim);
799 resize(Ndim, Zdim, Ydim, Xdim,
false);
806 resize(1, Zdim, Ydim, Xdim,
false);
813 resize(1, 1, Ydim, Xdim,
false);
820 resize(1, 1, 1, Xdim,
false);
913 return zinit + zdim - 1;
927 return yinit + ydim - 1;
941 return xinit + xdim - 1;
956 inline bool outside(
int k,
int i,
int j)
const 1004 if (
NSIZE(*
this) > 1)
1006 if (
ZSIZE(*
this) > 1)
1008 if (
YSIZE(*
this) > 1)
1075 void printShape(std::ostream& out = std::cout)
const;
void moveOriginTo(int k, int i, int j)
bool outside(int i, int j) const
virtual ~MultidimArrayBase()
void printShape(std::ostream &out=std::cout) const
void resize(size_t Ydim, size_t Xdim)
void maxIndex(int &jmax) const
virtual double computeAvg() const =0
ArrayDim getDimensions() const
virtual void coreAllocateReuse()=0
bool isCorner(const Matrix1D< double > &v) const
virtual void * getArrayPointer() const =0
virtual void selfReverseX()=0
virtual void coreDeallocate()=0
void resizeNoCopy(size_t Zdim, size_t Ydim, size_t Xdim)
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
virtual void computeDoubleMinMaxRange(double &minval, double &maxval, size_t offset, size_t size) const =0
void resize(size_t Zdim, size_t Ydim, size_t Xdim)
void maxIndex(int &imax, int &jmax) const
virtual void selfReverseY()=0
bool sameShape(const MultidimArrayBase &op) const
void maxIndex(ArrayCoord &pos) const
void resizeNoCopy(size_t Ydim, size_t Xdim)
void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)
virtual void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)=0
void copyShape(const MultidimArrayBase &m)
bool outside(int i) const
bool outside(int k, int i, int j) const
virtual void selfReverseZ()=0
void maxIndex(int &kmax, int &imax, int &jmax) const
void resizeNoCopy(size_t Xdim)
virtual void maxIndex(size_t &lmax, int &kmax, int &imax, int &jmax) const =0
void resizeNoCopy(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim)