26 #ifndef CORE_MULTIDIM_ARRAY_GENERIC_H_ 27 #define CORE_MULTIDIM_ARRAY_GENERIC_H_ 31 #include "utils/half.hpp" 45 #define SWITCHDATATYPE(datatype,OP) \ 64 {OP(unsigned short)};\ 80 {OP(half_float::half)};\ 83 REPORT_ERROR(ERR_ARG_INCORRECT,"Do not know how to handle this type at this point");\ 96 #ifndef MULTIDIM_ARRAY_BASE 97 #define MULTIDIM_ARRAY_BASE(v) (*((v).data->im)) 100 #ifndef MULTIDIM_ARRAY_GENERIC 101 #define MULTIDIM_ARRAY_GENERIC(v) (*((v).data)) 104 #ifndef MULTIDIM_ARRAY_TYPE 105 #define MULTIDIM_ARRAY_TYPE(v, type) (*((MultidimArray<type>*)(v.im))) 168 void resize(
size_t Ndim,
int Zdim,
int Ydim,
int Xdim,
bool copy=
true)
170 im->
resize(Ndim,Zdim,Ydim,Xdim,copy);
211 template <
typename T>
214 #define GETMULTIDIMARRAY(type) M = (T*) (((MultidimArray<type>*) im)->data); 216 #undef GETMULTIDIMARRAY 223 #define GETMULTIDIMARRAY(type) res = (void *) (((MultidimArray<type>*) im)->data); 225 #undef GETMULTIDIMARRAY 232 template <
typename T>
235 #define GETMULTIDIMARRAY(type) M = (MultidimArray<T>*) ((MultidimArray<type>*) im); 237 #undef GETMULTIDIMARRAY 244 double init_value = 0.)
const 246 #define WINDOW(type) _window(*((MultidimArray<type>*)(result.im)), z0,y0,x0,zF,yF,xF,init_value); 255 double init_value = 0.)
const 257 #define WINDOW(type) ((MultidimArray<type>*)im)->window(result, z0,y0,x0,zF,yF,xF,(T)init_value); 265 double init_value = 0.)
270 #define WINDOW(type) ((MultidimArray<type>*)im)->selfWindow(z0,y0,x0,zF,yF,xF,(type)init_value); 279 #define PATCH(type) ((MultidimArray<type>*)im)->patch(*((MultidimArray<type>*)(patchArray.im)), x, y); 288 template <
typename T>
291 #define GETSLICE(type) ((MultidimArray<type>*) im)->getSlice(k, M, axis, reverse, n); 302 #define GETSLICE(type) getSlice(k, *(MultidimArray<type>*)M->im, axis, reverse, n); 311 template <
typename T1>
314 #define SETSLICE(type) ((MultidimArray<type>*) im)->setSlice(k, v, n); 327 #define SETSLICE(type) setSlice(k,*(MultidimArray<type>*) v->im, n); 336 void getDimensions(
size_t& Xdim,
size_t& Ydim,
size_t& Zdim,
size_t &Ndim)
const 382 void computeStats(
double& avg,
double& stddev,
double& minval,
double& maxval)
const 384 #define COMPUTESTATS(type) type Tminval(0); \ 386 ((MultidimArray<type>*)(im))->computeStats(avg, stddev, Tminval, Tmaxval);\ 399 #define COMPUTESDOUBLEMINMAX(type) ((MultidimArray<type>*)(im))->computeDoubleMinMax(minval, maxval); 401 #undef COMPUTESDOUBLEMINMAX 410 #define RANGEADJUST(type) ((MultidimArray<type>*)(im))->rangeAdjust(*(MultidimArray<type>*)(example.im),mask); 429 #define OPERATORTIMESEQUAL(type) *((MultidimArray<type>*)(im)) *= (type)op1; 431 #undef OPERATORTIMESEQUAL 437 #define OPERATORPLUSEQUAL(type) *((MultidimArray<type>*)(im)) += *((MultidimArray<type>*)(op1.im)); 439 #undef OPERATORPLUSEQUAL 446 #define GETVALUE(type) ret = NZYX_ELEM(*(MultidimArray<type>*)im,n,k,i,j); 468 #define GETVALUE(type) ret = A2D_ELEM(*(MultidimArray<type>*)im,i,j); 489 template <
typename T>
492 #define TYPECAST(type) typeCast(*(MultidimArray<type>*)(im), M); 500 template <
typename T>
503 #define TYPECAST(type) typeCast(M, *(MultidimArray<type>*)(im)); 511 template <
typename T1>
513 int nF,
int zF,
int yF,
int xF,
514 T1 init_value = 0)
const 516 #define WINDOW(type) ((MultidimArray<type>*)(im))->window(result, n0, z0, y0, x0, nF, zF, yF, xF, init_value); void window(MultidimArrayGeneric &result, int z0, int y0, int x0, int zF, int yF, int xF, double init_value=0.) const
void window(MultidimArray< T1 > &result, int n0, int z0, int y0, int x0, int nF, int zF, int yF, int xF, T1 init_value=0) const
MultidimArrayGeneric & operator=(const MultidimArrayGeneric &input)
void * getArrayPointer() const
void aliasSlice(MultidimArrayGeneric &mdim, int select_slice)
void operator*=(double op1)
#define COMPUTESTATS(type)
#define REPORT_ERROR(nerr, ErrormMsg)
void computeStats(double &avg, double &stddev, double &minval, double &maxval) const
void selfWindow(int z0, int y0, int x0, int zF, int yF, int xF, double init_value=0.)
void computeDoubleMinMax(double &minval, double &maxval) const
void setSlice(int k, const MultidimArray< T1 > &v, size_t n=0)
virtual double computeAvg() const =0
void getMultidimArrayPointer(MultidimArray< T > *&M) const
virtual void selfReverseX()=0
void resize(ArrayDim &adim, bool copy=true)
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
void setDatatype(DataType imgType)
#define COMPUTESDOUBLEMINMAX(type)
void getSlice(int k, MultidimArray< T > &M, char axis='Z', bool reverse=false, size_t n=0) const
void getImage(MultidimArray< T > &M) const
void _window(MultidimArray< T > &result, int z0, int y0, int x0, int zF, int yF, int xF, double init_value=0.) const
#define OPERATORPLUSEQUAL(type)
virtual void selfReverseY()=0
double computeAvg() const
void getSlice(int k, MultidimArrayGeneric *M, char axis='Z', bool reverse=false, size_t n=0) const
void getDimensions(size_t &Xdim, size_t &Ydim) const
void resize(size_t Ndim, int Zdim, int Ydim, int Xdim, bool copy=true)
#define XMIPP_EQUAL_ACCURACY
double operator()(size_t n, int k, int i, int j) const
bool equal(const MultidimArrayGeneric &op, double accuracy=XMIPP_EQUAL_ACCURACY) const
void setImage(MultidimArray< T > &M)
void resize(MultidimArrayGeneric &mdim, bool copy=true)
void patch(MultidimArrayGeneric &patchArray, int x, int y)
void link(MultidimArrayBase *array)
void maxIndex(ArrayCoord &pos)
bool operator==(const MultidimArrayGeneric &mdA) const
MultidimArrayBase & operator()()
void getArrayPointer(T *&M) const
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
double operator()(int i, int j) const
void rangeAdjust(const MultidimArrayGeneric &example, const MultidimArray< int > *mask=NULL)
void getDimensions(size_t &Xdim, size_t &Ydim, size_t &Zdim) const
virtual void selfReverseZ()=0
#define OPERATORTIMESEQUAL(type)
void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)
#define GETMULTIDIMARRAY(type)
void getDimensions(size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim) const
void operator+=(const MultidimArrayGeneric &op1)
virtual void maxIndex(size_t &lmax, int &kmax, int &imax, int &jmax) const =0
void setSlice(int k, const MultidimArrayGeneric *v, size_t n=0)
#define SWITCHDATATYPE(datatype, OP)
#define RANGEADJUST(type)
void getDimensions(ArrayDim &adim)
void getDimensions(size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim) const
const MultidimArrayBase & operator()() const