Xmipp  v3.23.11-Nereus
multidim_array_base.h
Go to the documentation of this file.
1 /***************************************************************************
2  *
3  * Authors: David Strelak (davidstrelak@gmail.com)
4  *
5  * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20  * 02111-1307 USA
21  *
22  * All comments concerning this program package may be sent to the
23  * e-mail address 'xmipp@cnb.csic.es'
24  ***************************************************************************/
25 
26 #ifndef XMIPPCORE_CORE_MULTIDIM_ARRAY_BASE_H_
27 #define XMIPPCORE_CORE_MULTIDIM_ARRAY_BASE_H_
28 
29 #include <stddef.h>
30 #include <iostream>
31 #include "xmipp_array_dim.h"
32 #include "xmipp_array_coord.h"
33 
34 template<typename T>
35 class Matrix1D;
36 
51 #define STARTINGX(v) ((v).xinit)
52 
55 #define FINISHINGX(v) ((v).xinit + (int)(v).xdim - 1)
56 
59 #define STARTINGY(v) ((v).yinit)
60 
63 #define FINISHINGY(v) ((v).yinit + (int)(v).ydim - 1)
64 
67 #define STARTINGZ(v) ((v).zinit)
68 
71 #define FINISHINGZ(v) ((v).zinit + (int)(v).zdim - 1)
72 
75 #define INSIDEX(v, x) ((x) >= STARTINGX(v) && (x) <= FINISHINGX(v))
76 
78 #define INSIDEY(v, y) ((y) >= STARTINGY(v) && (y) <= FINISHINGY(v))
79 
81 #define INSIDEZ(v, z) ((z) >= STARTINGZ(v) && (z) <= FINISHINGZ(v))
82 
84 #define INSIDEXY(v, x, y) (INSIDEX(v, x) && INSIDEY(v, y))
85 
87 #define INSIDEXYZ(v, x, y, z) (INSIDEX(v, x) && INSIDEY(v, y) && INSIDEZ(v,z))
88 
91 #define XSIZE(v) ((v).xdim)
92 
95 #define YSIZE(v) ((v).ydim)
96 
99 #define ZSIZE(v) ((v).zdim)
100 
103 #define NSIZE(v) ((v).ndim)
104 
107 #define YXSIZE(v) ((v).yxdim)
108 
111 #define ZYXSIZE(v) ((v).zyxdim)
112 
115 #define MULTIDIM_SIZE(v) ((v).nzyxdim)
116 
119 #define NZYXSIZE(v) ((v).nzyxdim)
120 
125 #ifndef MULTIDIM_ARRAY
126 #define MULTIDIM_ARRAY(v) ((v).data)
127 #endif
128 
133 #define DIRECT_NZYX_ELEM(v, l, k, i, j) ((v).data[(l)*ZYXSIZE(v)+(k)*YXSIZE(v)+((i)*XSIZE(v))+(j)])
134 
139 #define DIRECT_ZYX_ELEM(v, k, i, j) ((v).data[(k)*YXSIZE(v)+((i)*XSIZE(v))+(j)])
140 
145 #define DIRECT_N_YX_ELEM(v, l, i, j) ((v).data[(l)*ZYXSIZE(v) +((i)*XSIZE(v))+(j)])
146 
150 #define DIRECT_N__X_ELEM(v, l, j) ((v).data[(l)*ZYXSIZE(v)+(j)])
151 
154 #define NZYX_ELEM(v, l, k, i, j) \
155  DIRECT_NZYX_ELEM((v), (l), (k) - STARTINGZ(v), (i) - STARTINGY(v), (j) - STARTINGX(v))
156 
161 #define DIRECT_MULTIDIM_ELEM(v,n) ((v).data[(n)])
162 
176 #define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v) \
177  for (size_t n=0; n<NZYXSIZE(v); ++n)
178 
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)
197 
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)
216 
233 #define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY_ptr(v,n,ptr) \
234  for ((n)=0, (ptr)=(v).data; (n)<NZYXSIZE(v); ++(n), ++(ptr))
235 
239 #define DIRECT_A3D_ELEM(v,k,i,j) ((v).data[YXSIZE(v)*(k)+((i)*XSIZE(v))+(j)])
240 
244 #define dAkij(V, k, i, j) DIRECT_A3D_ELEM(V, k, i, j)
245 
253 #define A3D_ELEM(V, k, i, j) \
254  DIRECT_A3D_ELEM((V),(k) - STARTINGZ(V), (i) - STARTINGY(V), (j) - STARTINGX(V))
255 
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)
273 
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)
308 
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)
326 
341 #define DIRECT_A2D_ELEM(v,i,j) ((v).data[(i)*(v).xdim+(j)])
342 
345 #define dAij(M, i, j) DIRECT_A2D_ELEM(M, i, j)
346 
354 #define A2D_ELEM(v, i, j) \
355  DIRECT_A2D_ELEM(v, (i) - STARTINGY(v), (j) - STARTINGX(v))
356 
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))
367 
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))
375 
376 
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)
393 
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)
421 
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))
449 
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))
475 
493 #define FOR_ALL_ELEMENTS_IN_ARRAY1D_BETWEEN(corner1, corner2) \
494  for (XX(r)=(int) XX((corner1)); XX(r)<=(int) XX((corner2)); ++XX(r))
495 
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)
512 
526 #define DIRECT_A1D_ELEM(v, i) ((v).data[(i)])
527 
530 #define dAi(v, i) DIRECT_A1D_ELEM(v, i)
531 
539 #define A1D_ELEM(v, i) DIRECT_A1D_ELEM(v, (i) - ((v).xinit))
540 
554 #define FOR_ALL_ELEMENTS_IN_ARRAY1D(v) \
555  for (int i=STARTINGX(v); i<=FINISHINGX(v); ++i)
556 
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)
579 
593 #define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY1D(v) \
594  for (size_t i=0; i<v.xdim; ++i)
595 
597 #define OUTSIDE(i,j) \
598  ((j) < STARTINGX(*this) || (j) > FINISHINGX(*this) || \
599  (i) < STARTINGY(*this) || (i) > FINISHINGY(*this))
600 
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))
606 
607 
608 // Look up table lenght to be used in interpolation.
609 #define LOOKUP_TABLE_LEN 6
610 
611 
616 {
617 public:
618  // Destroy data
620 
621  // Number of images
622  size_t ndim;
623 
624  // Number of elements in Z
625  size_t zdim;
626 
627  // Number of elements in Y
628  size_t ydim;
629 
630  // Number of elements in X
631  size_t xdim;
632 
633  // Number of elements in YX
634  size_t yxdim;
635 
636  // Number of elements in ZYX
637  size_t zyxdim;
638 
639  // Number of elements in NZYX
640  size_t nzyxdim;
641 
642  // Z init
643  int zinit;
644 
645  // Y init
646  int yinit;
647 
648  // X init
649  int xinit;
650 
651  //Alloc memory or map to a file
652  bool mmapOn;
653  //Mapped file handler
654  FILE* mFd;
655  // Number of elements in NZYX in allocated memory
656  size_t nzyxdimAlloc;
657 public:
659  {}
660 
661  // Virtual declarations to be used from MultidimArrayGeneric
662  virtual void clear() = 0;
663  virtual void selfReverseX() = 0;
664  virtual void selfReverseY() = 0;
665  virtual void selfReverseZ() = 0;
666  virtual double computeAvg() const = 0;
667  virtual void computeDoubleMinMaxRange(double& minval, double& maxval,size_t offset, size_t size) const = 0;
668  virtual void maxIndex(size_t &lmax, int& kmax, int& imax, int& jmax) const = 0;
669  virtual void coreAllocateReuse() = 0;
670  virtual void coreDeallocate()= 0;
671 
672  /* return the value of the data pointer
673  */
674  virtual void * getArrayPointer() const = 0;
675 
677 
678 
683  void setNdim(int Ndim);
684 
690  void setZdim(int Zdim);
691 
697  void setYdim(int Ydim);
698 
704  void setXdim(int Xdim);
705 
709  void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim);
710 
714  void setDimensions(ArrayDim &newDim);
715 
718  void getDimensions(size_t& Xdim, size_t& Ydim, size_t& Zdim, size_t &Ndim) const;
719  void getDimensions(ArrayDim &idim) const;
720  ArrayDim getDimensions() const;
721 
722 
731  void getDimensions(int* size) const;
732 
739  size_t getSize() const;
740 
752  virtual void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true) = 0;
753 
761  void resize(size_t Zdim, size_t Ydim, size_t Xdim)
762  {
763  resize(1, Zdim, Ydim, Xdim);
764  }
765 
773  void resize(size_t Ydim, size_t Xdim)
774  {
775  resize(1, 1, Ydim, Xdim);
776  }
777 
785  void resize(size_t Xdim)
786  {
787  resize(1, 1, 1, Xdim);
788  }
789 
793  void resize(ArrayDim &adim, bool copy=true);
794 
797  void resizeNoCopy(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim)
798  {
799  resize(Ndim, Zdim, Ydim, Xdim, false);
800  }
801 
804  void resizeNoCopy(size_t Zdim, size_t Ydim, size_t Xdim)
805  {
806  resize(1, Zdim, Ydim, Xdim, false);
807  }
808 
811  void resizeNoCopy(size_t Ydim, size_t Xdim)
812  {
813  resize(1, 1, Ydim, Xdim, false);
814  }
815 
818  void resizeNoCopy(size_t Xdim)
819  {
820  resize(1, 1, 1, Xdim, false);
821  }
822 
825  inline size_t rowNumber() const
826  {
827  return ydim;
828  }
829 
832  inline size_t colNumber() const
833  {
834  return xdim;
835  }
836 
840  void copyShape(const MultidimArrayBase &m);
841 
847  inline bool sameShape(const MultidimArrayBase &op) const
848  {
849  return (NSIZE(*this) == NSIZE(op) &&
850  XSIZE(*this) == XSIZE(op) &&
851  YSIZE(*this) == YSIZE(op) &&
852  ZSIZE(*this) == ZSIZE(op) &&
853  STARTINGX(*this) == STARTINGX(op) &&
854  STARTINGY(*this) == STARTINGY(op) &&
855  STARTINGZ(*this) == STARTINGZ(op));
856  }
857 
867  void setXmippOrigin();
868 
878  void resetOrigin();
879 
889  void moveOriginTo(int k, int i, int j);
890 
900  void moveOriginTo(int i, int j);
901 
904  inline int startingZ() const
905  {
906  return zinit;
907  }
908 
911  inline int finishingZ() const
912  {
913  return zinit + zdim - 1;
914  }
915 
918  inline int startingY() const
919  {
920  return yinit;
921  }
922 
925  inline int finishingY() const
926  {
927  return yinit + ydim - 1;
928  }
929 
932  inline int startingX() const
933  {
934  return xinit;
935  }
936 
939  inline int finishingX() const
940  {
941  return xinit + xdim - 1;
942  }
943 
949  bool isCorner(const Matrix1D< double >& v) const;
950 
956  inline bool outside(int k, int i, int j) const
957  {
958  return (j < STARTINGX(*this) || j > FINISHINGX(*this) ||
959  i < STARTINGY(*this) || i > FINISHINGY(*this) ||
960  k < STARTINGZ(*this) || k > FINISHINGZ(*this));
961  }
962 
968  inline bool outside(int i, int j) const
969  {
970  return (j < STARTINGX(*this) || j > FINISHINGX(*this) ||
971  i < STARTINGY(*this) || i > FINISHINGY(*this));
972  }
973 
979  inline bool outside(int i) const
980  {
981  return (i < STARTINGX(*this) || i > FINISHINGX(*this));
982  }
983 
989  bool outside(const Matrix1D<double> &r) const;
990 
992 
993 
1000  inline int getDim() const
1001  {
1002  if (NZYXSIZE(*this) < 1)
1003  return 0;
1004  if (NSIZE(*this) > 1)
1005  return 4;
1006  if (ZSIZE(*this) > 1)
1007  return 3;
1008  if (YSIZE(*this) > 1)
1009  return 2;
1010  return 1;
1011  }
1012 
1018  void setMmap(bool mmap)
1019  {
1020  coreDeallocate();
1021  mmapOn = mmap;
1022  }
1023 
1024  void maxIndex(ArrayCoord &pos) const
1025  {
1026  maxIndex(pos.n, pos.z, pos.y, pos.x);
1027  }
1028 
1033  void maxIndex(int& kmax, int& imax, int& jmax) const
1034  {
1035  size_t dum;
1036  maxIndex(dum, kmax, imax, jmax);
1037  }
1038 
1043  void maxIndex(int& imax, int& jmax) const
1044  {
1045  size_t dum;
1046  int idum;
1047  maxIndex(dum, idum, imax, jmax);
1048  }
1049 
1054  void maxIndex(int& jmax) const
1055  {
1056  size_t dum;
1057  int idum;
1058  maxIndex(dum, idum, idum, jmax);
1059  }
1060 
1075  void printShape(std::ostream& out = std::cout) const;
1076 };
1077 
1078 #endif /* XMIPPCORE_CORE_MULTIDIM_ARRAY_BASE_H_ */
void moveOriginTo(int k, int i, int j)
#define NSIZE(v)
#define YSIZE(v)
bool outside(int i, int j) const
#define FINISHINGX(v)
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
#define FINISHINGZ(v)
void resizeNoCopy(size_t Zdim, size_t Ydim, size_t Xdim)
void resize(size_t Xdim)
#define STARTINGX(v)
#define i
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
#define STARTINGY(v)
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
void setMmap(bool mmap)
bool sameShape(const MultidimArrayBase &op) const
void maxIndex(ArrayCoord &pos) const
#define XSIZE(v)
#define ZSIZE(v)
void resizeNoCopy(size_t Ydim, size_t Xdim)
#define NZYXSIZE(v)
void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)
#define j
size_t colNumber() const
virtual void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)=0
int m
void copyShape(const MultidimArrayBase &m)
bool outside(int i) const
#define FINISHINGY(v)
Definition: ctf.h:38
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)
int idum
virtual void maxIndex(size_t &lmax, int &kmax, int &imax, int &jmax) const =0
#define STARTINGZ(v)
void resizeNoCopy(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim)
size_t rowNumber() const
virtual void clear()=0