26 #ifndef CORE_MULTIDIM_ARRAY_H 27 #define CORE_MULTIDIM_ARRAY_H 102 MultidimArray(
size_t Ndim,
size_t Zdim,
size_t Ydim,
size_t Xdim, T *data) {
189 for (
size_t i = 0;
i < V.
size();
i++)
202 for (
size_t i = 0;
i < vector.size();
i++)
243 std::swap(
xdim, other.xdim);
244 std::swap(
ydim, other.ydim);
245 std::swap(
zdim, other.zdim);
246 std::swap(
ndim, other.ndim);
247 std::swap(
yxdim, other.yxdim);
248 std::swap(
zyxdim, other.zyxdim);
249 std::swap(
nzyxdim, other.nzyxdim);
250 std::swap(
xinit, other.xinit);
251 std::swap(
yinit, other.yinit);
252 std::swap(
zinit, other.zinit);
253 std::swap(data, other.data);
256 std::swap(
mmapOn, other.mmapOn);
257 std::swap(
mFd, other.mFd);
264 if (_ndim <= 0 || _zdim <= 0 || _ydim<=0 || _xdim<=0)
307 catch (std::bad_alloc &)
313 memset(data,0,
nzyxdim*
sizeof(T));
338 memset(data,0,
nzyxdim*
sizeof(T));
344 FILE*
mmapFile(T* &_data,
size_t nzyxDim)
const;
398 if (select_row >=
YSIZE(m))
403 this->data = m.
data +
XSIZE(m)*select_row;
418 if (select_slice >=
ZSIZE(m))
438 if (select_image >=
NSIZE(m))
475 void resize(
size_t Ndim,
size_t Zdim,
size_t Ydim,
size_t Xdim,
bool copy=
true);
489 template<
typename T1>
503 template<
typename T1>
520 #define checkDimension(dim) checkDimensionWithDebug(dim,__FILE__,__LINE__) 525 std::cerr<<
" Check for dimension: " << dim <<std::endl;
526 std::cerr <<
"MultidimArray shape: ";
528 std::cerr << std::endl;
529 std::cerr <<
"Check called from file "<<file<<
" line "<<line<<std::endl;
539 int nF,
int zF,
int yF,
int xF,
550 else if (this->
ydim >1)
557 else if (this->
xdim >1)
565 int nF,
int zF,
int yF,
int xF,
566 T1 init_value = 0)
const 572 window(result, z0, y0, x0,
576 else if (this->
ydim >1)
582 else if (this->
xdim >1)
584 window(result, x0, xF, init_value);
616 T1 init_value = 0)
const 618 result.
resizeNoCopy(zF - z0 + 1, yF - y0 + 1, xF - x0 + 1);
642 window(result,z0,y0,x0,zF,yF,xF,init_value);
667 T1 init_value = 0)
const 686 window(result,y0,x0,yF,xF,init_value);
722 window(result,x0,xF,init_value);
729 int n =
XSIZE(patchArray)*
sizeof(T);
731 for (
size_t i=0;
i <
YSIZE(patchArray); ++
i)
732 memcpy(&
dAij(*
this, y+
i, x), &
dAij(patchArray,
i, 0),
n);
879 if (
XSIZE(*
this) == 0)
885 if (n >
NSIZE(*
this))
920 template <
typename T1>
923 if (
XSIZE(*
this) == 0)
935 "Slice: Multidim subscript (k) out of range");
942 int zEnd =
ZSIZE(*
this) - 1;
959 "Slice: Multidim subscript (i) out of range");
966 int zEnd =
ZSIZE(*
this) - 1;
982 "Slice: Multidim subscript (j) out of range");
989 int zEnd =
ZSIZE(*
this) - 1;
1032 template <
typename T1>
1040 "setSlice: MultidimArray subscript (k=%d) out of range [%d, %d]",
1045 "setSlice: MultidimArray dimensions different from the matrix ones");
1061 template <
typename T1>
1087 flip = flip^reverse;
1089 out.
resize(aDimOut,
false);
1095 for (
size_t k = 0; k < aDimOut.
zdim; k++)
1098 index = k + (aDimOut.
zdim - 1 - 2*
k) * (
int)flip;
1099 this->
getSlice(index, imTemp, axis, !reverse);
1138 for (
size_t i = 0;
i <
ydim;
i++)
1161 "setCol: Vector dimension different from matrix one");
1163 for (
size_t i = 0;
i <
ydim;
i++)
1206 if (i < 0 || i >=
ydim)
1211 "setRow: Vector dimension different from matrix one");
1236 int& k_phys,
int& i_phys,
int& j_phys)
const 1252 int& k_log,
int& i_log,
int& j_log)
const 1267 void toPhysical(
int i_log,
int j_log,
int& i_phys,
int& j_phys)
const 1281 void toLogical(
int i_phys,
int j_phys,
int &i_log,
int& j_log)
const 1331 double doutside_value=outside_value;
1332 double d000 = (
OUTSIDE3D(z0, y0, x0)) ? doutside_value :
A3D_ELEM(*
this, z0, y0, x0);
1333 double d001 = (
OUTSIDE3D(z0, y0, x1)) ? doutside_value :
A3D_ELEM(*
this, z0, y0, x1);
1334 double d010 = (
OUTSIDE3D(z0, y1, x0)) ? doutside_value :
A3D_ELEM(*
this, z0, y1, x0);
1335 double d011 = (
OUTSIDE3D(z0, y1, x1)) ? doutside_value :
A3D_ELEM(*
this, z0, y1, x1);
1336 double d100 = (
OUTSIDE3D(z1, y0, x0)) ? doutside_value :
A3D_ELEM(*
this, z1, y0, x0);
1337 double d101 = (
OUTSIDE3D(z1, y0, x1)) ? doutside_value :
A3D_ELEM(*
this, z1, y0, x1);
1338 double d110 = (
OUTSIDE3D(z1, y1, x0)) ? doutside_value :
A3D_ELEM(*
this, z1, y1, x0);
1339 double d111 = (
OUTSIDE3D(z1, y1, x1)) ? doutside_value :
A3D_ELEM(*
this, z1, y1, x1);
1369 #define ASSIGNVAL2D(d,i,j) \ 1370 if ((j) < j0 || (j) > jF || (i) < i0 || (i) > iF) \ 1373 d=A2D_ELEM(*this, i, j); 1375 double d00, d10, d11, d01;
1406 #define ASSIGNVAL2DNODIV(d,i,j) \ 1407 b = ((j) < j0 || (j) > jF || (i) < i0 || (i) > iF); \ 1408 b ? d=0 : d=A2D_ELEM(*this, i, j); 1410 double d00, d10, d11, d01;
1434 #define ASSIGNVAL1D(d,j) \ 1435 if ((j) < j0 || (j) > jF) \ 1438 d=A1D_ELEM(*this, j); 1453 int SplineDegree = 3)
const;
1510 double avgval, devval;
1514 out.setf(std::ios::showpoint);
1515 int old_prec = out.precision(7);
1530 out.precision(old_prec);
1540 return static_cast< T
>(0);
1561 maxIndex(zeroLong,zeroInt,zeroInt,jmax);
1571 return static_cast< T
>(0);
1589 void minIndex(
int &lmin,
int& kmin,
int& imin,
int& jmin)
const 1591 if (
XSIZE(*
this) == 0)
1593 lmin = kmin = imin = jmin = -1;
1636 minIndex(zeroInt,zeroInt,imin,jmin);
1646 minIndex(zeroInt,zeroInt,zeroInt,jmin);
1654 void maxIndex(
size_t &lmax,
int& kmax,
int& imax,
int& jmax)
const 1656 if (
XSIZE(*
this) == 0)
1658 lmax = kmax = imax = jmax = -1;
1702 else if (val > Tmax)
1705 minval =
static_cast< double >(Tmin);
1706 maxval =
static_cast< double >(Tmax);
1718 minval = maxval =
static_cast< double >(data[offset]);
1724 for (n=offset,ptr=data+offset; n<size; ++
n, ++ptr)
1728 minval =
static_cast< double >(val);
1729 else if (val > maxval)
1730 maxval =
static_cast< double >(val);
1749 sum +=
static_cast< double >(*ptr);
1765 double avg = 0, stddev = 0;
1771 double val=
static_cast< double >(*ptr);
1773 stddev += val * val;
1777 stddev = stddev /
NZYXSIZE(*
this) - avg * avg;
1781 stddev =
sqrt(static_cast<double>((
ABS(stddev))));
1799 minval = maxval = data[0];
1808 stddev += val * val;
1812 else if (Tval < minval)
1820 stddev = stddev /
NZYXSIZE(*
this) - avg * avg;
1824 stddev =
sqrt(static_cast< double >(
ABS(stddev)));
1835 template<
typename U>
1839 std::is_same<double, U>::value || std::is_same<float, U>::value,
1840 "U must be a floating presiont type");
1847 for (
size_t n = 0;
n < nMax; ++
n)
1858 stddev = stddev /
NZYXSIZE(*
this) - avg * avg;
1862 stddev =
sqrt(fabs(stddev));
1874 double& avg,
double& stddev)
const 1894 stddev =
sqrt(fabs(sum2 / N - avg * avg) * N / (N - 1));
1914 (*this).checkDimension(2);
1915 min_val = max_val =
NZYX_ELEM((*
this),
n, 0,
YY(corner1),
XX(corner1));
1918 double N = 0,
sum = 0,
sum2 = 0;
1923 sum2 += (*this)(r) * (*
this)(r);
1926 if ((*
this)(r) < min_val)
1927 min_val = (*this)(r);
1928 else if ((*
this)(r) > max_val)
1929 max_val = (*this)(r);
1935 stddev =
sqrt(
sum2 / N - avg * avg);
1953 if (
XSIZE(*
this) == 0)
1956 if (
XSIZE(*
this) == 1)
1987 double min0=0., max0=0.;
1994 slope =
static_cast< double >(maxF - minF) /
1995 static_cast< double >(max0 - min0);
2002 *ptr = minF +
static_cast< T
>(slope *
2003 static_cast< double >(*ptr - min0));
2024 double min0=0., max0=0.;
2036 min0=max0=(double)val;
2052 slope =
static_cast< double >(maxF - minF) /
2053 static_cast< double >(max0 - min0);
2058 *ptr = minF +
static_cast< T
>(slope *
2059 static_cast< double >(*ptr - min0));
2079 double avgExample=0., stddevExample=0., avgThis, stddevThis;
2092 double b=stddevThis>0? stddevExample/stddevThis:0;
2093 double a=avgExample-avgThis*
b;
2098 *ptr =
static_cast< T
>(a+b *
static_cast< double > (*ptr));
2113 template<
typename U>
2117 std::is_same<double, U>::value || std::is_same<float, U>::value,
2118 "U must be a floating presiont type");
2127 U
a = (stddev0 != 0) ? (stddevF / stddev0) : 0;
2128 U
b = avgF - a * avg0;
2132 for (
size_t n=0;
n<
nmax;
n+=4, ptr+=4)
2134 *(ptr )= static_cast< T >(a * (*(ptr )) + b);
2135 *(ptr+1)= static_cast< T >(a * (*(ptr+1)) + b);
2136 *(ptr+2)= static_cast< T >(a * (*(ptr+2)) + b);
2137 *(ptr+3)= static_cast< T >(a * (*(ptr+3)) + b);
2140 *(ptr )=
static_cast< T
>(a * (*(ptr )) +
b);
2172 const size_t unroll=4;
2177 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data,ptrOp2=op2.
data;
2178 n<nmax; n+=unroll, ptrResult+=unroll, ptrOp1+=unroll, ptrOp2+=unroll)
2180 *ptrResult = *ptrOp1 + *ptrOp2;
2181 *(ptrResult+1) = *(ptrOp1+1) + *(ptrOp2+1);
2182 *(ptrResult+2) = *(ptrOp1+2) + *(ptrOp2+2);
2183 *(ptrResult+3) = *(ptrOp1+3) + *(ptrOp2+3);
2185 for (n=nmax, ptrResult=result.
data+nmax, ptrOp1=op1.
data+nmax, ptrOp2=op2.
data+nmax;
2186 n<op1.
zyxdim; ++n, ++ptrResult, ++ptrOp1, ++ptrOp2)
2187 *ptrResult = *ptrOp1 + *ptrOp2;
2190 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data,ptrOp2=op2.
data;
2191 n<nmax; n+=unroll, ptrResult+=unroll, ptrOp1+=unroll, ptrOp2+=unroll)
2193 *ptrResult = *ptrOp1 - *ptrOp2;
2194 *(ptrResult+1) = *(ptrOp1+1) - *(ptrOp2+1);
2195 *(ptrResult+2) = *(ptrOp1+2) - *(ptrOp2+2);
2196 *(ptrResult+3) = *(ptrOp1+3) - *(ptrOp2+3);
2198 for (n=nmax, ptrResult=result.
data+nmax, ptrOp1=op1.
data+nmax, ptrOp2=op2.
data+nmax;
2199 n<op1.
zyxdim; ++n, ++ptrResult, ++ptrOp1, ++ptrOp2)
2200 *ptrResult = *ptrOp1 - *ptrOp2;
2203 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data,ptrOp2=op2.
data;
2204 n<nmax; n+=unroll, ptrResult+=unroll, ptrOp1+=unroll, ptrOp2+=unroll)
2206 *ptrResult = *ptrOp1 * *ptrOp2;
2207 *(ptrResult+1) = *(ptrOp1+1) * *(ptrOp2+1);
2208 *(ptrResult+2) = *(ptrOp1+2) * *(ptrOp2+2);
2209 *(ptrResult+3) = *(ptrOp1+3) * *(ptrOp2+3);
2211 for (n=nmax, ptrResult=result.
data+nmax, ptrOp1=op1.
data+nmax, ptrOp2=op2.
data+nmax;
2212 n<op1.
zyxdim; ++n, ++ptrResult, ++ptrOp1, ++ptrOp2)
2213 *ptrResult = *ptrOp1 * *ptrOp2;
2216 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data,ptrOp2=op2.
data;
2217 n<nmax; n+=unroll, ptrResult+=unroll, ptrOp1+=unroll, ptrOp2+=unroll)
2219 *ptrResult = *ptrOp1 / *ptrOp2;
2220 *(ptrResult+1) = *(ptrOp1+1) / *(ptrOp2+1);
2221 *(ptrResult+2) = *(ptrOp1+2) / *(ptrOp2+2);
2222 *(ptrResult+3) = *(ptrOp1+3) / *(ptrOp2+3);
2224 for (n=nmax, ptrResult=result.
data+nmax, ptrOp1=op1.
data+nmax, ptrOp2=op2.
data+nmax;
2225 n<op1.
zyxdim; ++n, ++ptrResult, ++ptrOp1, ++ptrOp2)
2226 *ptrResult = *ptrOp1 / *ptrOp2;
2249 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data,ptrOp2=op2.
data,
2251 n<op1.
nzyxdim; n++, ptrResult++,
2252 ptrOp1++, ptrOp2++, ptrMask++)
2254 if ((*ptrMask)==zero)
2255 *ptrResult += (*ptrOp1);
2257 *ptrResult += (*ptrOp2);
2261 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data,ptrOp2=op2.
data,
2263 n<op1.
nzyxdim; n++, ptrResult++,
2264 ptrOp1++, ptrOp2++, ptrMask++)
2266 if ((*ptrMask)==zero)
2267 *ptrResult -= (*ptrOp1);
2269 *ptrResult -= (*ptrOp2) * (*ptrMask);
2274 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data,ptrOp2=op2.
data,
2276 n<op1.
nzyxdim; n++, ptrResult++,
2277 ptrOp1++, ptrOp2++, ptrMask++)
2279 if ((*ptrMask)==zero)
2280 *ptrResult *= (*ptrOp1);
2282 *ptrResult *= (*ptrOp2) * (*ptrMask);
2286 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data,ptrOp2=op2.
data,
2288 n<op1.
nzyxdim; n++, ptrResult++,
2289 ptrOp1++, ptrOp2++, ptrMask++)
2291 if ((*ptrMask)==zero)
2292 *ptrResult /= (*ptrOp1);
2294 *ptrResult /= (*ptrOp2) * (*ptrMask);
2317 formatString(
"Array_by_array: different shapes (%c)", operation));
2336 formatString(
"Array_by_array: different shapes (%c)", operation));
2413 const size_t unroll=4;
2415 for (n=0, ptrOp1=data,ptrOp2=op1.
data;
2416 n<nmax; n+=unroll, ptrOp1+=unroll, ptrOp2+=unroll)
2418 dot += *ptrOp1 * *ptrOp2;
2419 dot += *(ptrOp1+1) * *(ptrOp2+1);
2420 dot += *(ptrOp1+2) * *(ptrOp2+2);
2421 dot += *(ptrOp1+3) * *(ptrOp2+3);
2423 for (n=nmax, ptrOp1=data+nmax, ptrOp2=op1.
data+nmax;
2425 dot += *ptrOp1 * *ptrOp2;
2459 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data;
2460 n<op1.
zyxdim; ++n, ++ptrResult, ++ptrOp1)
2461 *ptrResult = *ptrOp1 + op2;
2464 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data;
2465 n<op1.
zyxdim; ++n, ++ptrResult, ++ptrOp1)
2466 *ptrResult = *ptrOp1 - op2;
2469 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data;
2470 n<op1.
zyxdim; ++n, ++ptrResult, ++ptrOp1)
2471 *ptrResult = *ptrOp1 * op2;
2474 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data;
2475 n<op1.
zyxdim; ++n, ++ptrResult, ++ptrOp1)
2476 *ptrResult = *ptrOp1 / op2;
2479 for (n=0, ptrResult=result.
data, ptrOp1=op1.
data;
2480 n<op1.
zyxdim; ++n, ++ptrResult, ++ptrOp1)
2481 *ptrResult = *ptrOp1 == op2;
2616 for (n=0, ptrResult=result.
data, ptrOp2=op2.
data;
2617 n<op2.
zyxdim; ++n, ++ptrResult, ++ptrOp2)
2621 *ptrResult = op1 + *ptrOp2;
2624 *ptrResult = op1 - *ptrOp2;
2627 *ptrResult = op1 * *ptrOp2;
2630 *ptrResult = op1 / *ptrOp2;
2722 template <
typename T1>
2727 memset(data,0,
nzyxdim*
sizeof(T));
2741 memset(data,0,
nzyxdim*
sizeof(T));
2746 inline void initZeros(
size_t Ndim,
size_t Zdim,
size_t Ydim,
size_t Xdim)
2749 resize(Ndim, Zdim,Ydim,Xdim,
false);
2750 memset(data,0,
nzyxdim*
sizeof(T));
2804 steps = 1 + (int)
FLOOR((
double)
ABS((maxF - minF)) / ((double)
n));
2805 slope =
n *
SGN(maxF - minF);
2807 else if (
mode ==
"steps")
2810 slope = (maxF - minF) / (steps - 1);
2822 A1D_ELEM(*
this,
i) = (T)((
double) minF + slope *
i);
2878 double df = 3.)
const;
2946 for (
int i = 1;
i <= Ydim;
i++)
2947 for (
int j = 1;
j <= Xdim;
j++)
3000 if ((imask == NULL ||
NZYX_ELEM(*imask,
n, k,
i,
j)) &&
3047 double iSize=1.0/
XSIZE(indx);
3096 if (type ==
"abs_above")
3098 else if (type ==
"abs_below")
3100 else if (type ==
"above")
3102 else if (type ==
"below")
3104 else if (type ==
"range")
3106 else if (type ==
"soft")
3110 formatString(
"Threshold: mode not supported (%s)", type.c_str() ));
3123 *ptr =
SGN(*ptr) *
b;
3127 *ptr =
SGN(*ptr) *
b;
3167 if (type ==
"abs_above")
3169 else if (type ==
"abs_below")
3171 else if (type ==
"above")
3173 else if (type ==
"below")
3175 else if (type ==
"range")
3179 formatString(
"CountThreshold: mode not supported (%s)", type.c_str()));
3207 if (*ptr >= a && *ptr <= b)
3230 if (
ABS(*ptr - oldv) <= accuracy)
3261 if (*ptr <= val + accuracy)
3281 if ( (*ptr < valMax) && (*ptr > valMin) )
3394 *ptr =
static_cast< T
>(
sqrt(static_cast< double >(*ptr)));
3429 const size_t unroll=4;
3432 for (
size_t n=0;
n<
nmax;
n+=unroll, ptr+=unroll)
3434 sum+= (*ptr)*(*ptr);
3436 sum+= (*ptr1)*(*ptr1);
3438 sum+= (*ptr2)*(*ptr2);
3440 sum+= (*ptr3)*(*ptr3);
3443 for (
size_t n=nmax;
n<
NZYXSIZE(*
this); ++
n, ++ptr)
3457 *ptr =
static_cast< T
>(
log10(static_cast< double >(*ptr)));
3469 *ptr =
static_cast< T
>(
log(static_cast< double >(*ptr)));
3503 size_t xsize=
XSIZE(*
this);
3504 size_t halfSizeX = (xsize-2)/2;
3505 size_t xsize_1=xsize-1;
3506 for (
size_t k = 0; k <
ZSIZE(*
this); k++)
3507 for (
size_t i = 0;
i <
YSIZE(*
this);
i++)
3508 for (
size_t j = 0;
j <=halfSizeX;
j++)
3533 size_t ysize=
YSIZE(*
this);
3534 size_t halfSizeY = (ysize-2)/2;
3535 size_t ysize_1=ysize-1;
3536 for (
size_t k = 0; k <
ZSIZE(*
this); k++)
3537 for (
size_t i = 0;
i <= halfSizeY;
i++)
3538 for (
size_t j = 0;
j <
XSIZE(*
this);
j++)
3555 size_t zsize=
ZSIZE(*
this);
3556 size_t halfSizeZ = (zsize-2)/2;
3557 size_t zsize_1=zsize-1;
3558 for (
size_t k = 0; k <= halfSizeZ; k++)
3559 for (
size_t i = 0;
i <
YSIZE(*
this);
i++)
3560 for (
size_t j = 0;
j <
XSIZE(*
this);
j++)
3581 double tx_step = (double)(xF - x0) / (N - 1);
3582 double ty_step = (double)(yF - y0) / (N - 1);
3583 double tx =
x0, ty =
y0;
3585 for (
int i = 0;
i < N;
i++)
3748 template<
typename T1,
typename T2>
3761 const size_t unroll=4;
3763 for (
size_t n=0;
n<
nmax;
n+=unroll, ptr1+=unroll)
3775 template<
typename T1>
3784 v2.resizeNoCopy(v1);
3789 const size_t unroll=4;
3791 for (
size_t n=0;
n<
nmax;
n+=unroll, ptr1+=unroll)
3793 *(ptr2++) = static_cast<double>(*ptr1);
3795 *(ptr2++) = static_cast< double >(*(ptr1+1));
3797 *(ptr2++) = static_cast< double >(*(ptr1+2));
3799 *(ptr2++) = static_cast< double >(*(ptr1+3));
3805 *(ptr2++) = static_cast< double >(*ptr1);
3813 template<
typename T1>
3821 template<
typename T>
3831 template<
typename T>
3834 return op1.
equal(op2);
3838 template<
typename T>
3865 template<
typename T>
3875 V1.
window(z0, y0, x0, zF, yF, xF);
3876 V2.
window(z0, y0, x0, zF, yF, xF);
3887 double &p0,
double &p1,
double &p2);
3901 template <
typename T>
3915 template <
typename T>
3916 std::ostream& operator<< (std::ostream& ostrm, const MultidimArray<T>& v)
3919 ostrm <<
"NULL Array\n";
3940 for (
size_t l = 0; l <
NSIZE(v); l++)
3943 ostrm <<
"Image No. " << l << std::endl;
3947 ostrm <<
"Slice No. " << k << std::endl;
3966 template<
typename T>
3968 size_t y0,
size_t x0,
size_t yF,
size_t xF);
3973 template <
typename T>
3981 double retval = 0, aux;
3982 double mean_x, mean_y;
3983 double stddev_x, stddev_y;
4003 if (Contributions != NULL)
4019 A3D_ELEM(*Contributions, k,
i,
j) /= ((stddev_x * stddev_y) * N);
4028 retval-=N*mean_x*mean_y;
4046 return retval / ((stddev_x * stddev_y) * N);
4054 std::ostream& operator<<(std::ostream& ostrm, const MultidimArray< std::complex<double> >& v);
#define ASSIGNVAL1D(d, j)
void typeCastComplex(const MultidimArray< T1 > &v1, MultidimArray< std::complex< double > > &v2)
void reslice(AxisView face, bool flip=false, size_t n=0)
void substitute(T oldv, T newv, double accuracy=XMIPP_EQUAL_ACCURACY, MultidimArray< int > *mask=NULL)
void patch(MultidimArray< T > patchArray, int x, int y)
void planeFit(const MultidimArray< double > &z, const MultidimArray< double > &x, const MultidimArray< double > &y, double &p0, double &p1, double &p2)
void operator*=(const MultidimArray< T > &op1)
void selfWindow(int n0, int z0, int y0, int x0, int nF, int zF, int yF, int xF, T init_value=0)
void binarizeRange(double valMin=0, double valMax=255, MultidimArray< int > *mask=NULL)
T interpolatedElementBSpline1D(double x, int SplineDegree=3) const
MultidimArray< T > operator-() const
void killAdaptationForNumericalRecipes22D(T **m) const
#define A2D_ELEM(v, i, j)
void minIndex(int &jmin) const
void coreDeallocate() noexcept
friend MultidimArray< T > operator/(T op1, const MultidimArray< T > &op2)
void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)
MultidimArray(int Ydim, int Xdim)
void window(MultidimArray< T1 > &result, int y0, int x0, int yF, int xF, T1 init_value=0) const
void cumlativeDensityFunction(MultidimArray< double > &cdf)
void free_Tvolume(T ***&m, int nsl, int nsh, int nrl, int nrh, int ncl, int nch)
friend void MultidimArrayMIN(const MultidimArray< T > &v1, const MultidimArray< T > &v2, MultidimArray< T > &result)
void threshold(const String &type, T a, T b=0, MultidimArray< int > *mask=NULL)
void coreAllocate(size_t _ndim, int _zdim, int _ydim, int _xdim)
MultidimArray< T > operator-(T op1) const
__host__ __device__ float2 floor(const float2 v)
#define DIRECT_NZYX_ELEM(v, l, k, i, j)
#define OUTSIDE3D(k, i, j)
void getSlice(int k, MultidimArray< T1 > &M, char axis='Z', bool reverse=false, size_t n=0) const
void minIndex(int &lmin, int &kmin, int &imin, int &jmin) const
void coreScalarByArray(const T &op1, const MultidimArray< T > &op2, MultidimArray< T > &result, char operation)
void printShape(std::ostream &out=std::cout) const
#define REPORT_ERROR(nerr, ErrormMsg)
void computeStats(double &avg, double &stddev, T &min_val, T &max_val, Matrix1D< int > &corner1, Matrix1D< int > &corner2, size_t n=0)
void operator+=(const MultidimArray< T > &op1)
T interpolatedElementBSpline2D_Degree3(double x, double y) const
void sort(MultidimArray< T > &result) const
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY2D(m)
void initRandom(double op1, double op2, RandomMode mode=RND_UNIFORM)
friend void scalarByArray(T op1, const MultidimArray< T > &op2, MultidimArray< T > &result, char operation)
void resizeNoCopy(const MultidimArray< T1 > &v)
FILE * mmapFile(T *&_data, size_t nzyxDim) const
void minIndex(int &imin, int &jmin) const
void sqrt(Image< double > &op)
void aliasImageInStack(const MultidimArray< T > &m, size_t select_image)
double dotProduct(const MultidimArray< T > &op1)
ArrayDim getDimensions() const
friend void arrayByArray(const MultidimArray< T > &op1, const MultidimArray< T > &op2, MultidimArray< T > &result, char operation)
void computeStats(double &avg, double &stddev, T &minval, T &maxval) const
friend MultidimArray< T > operator*(T op1, const MultidimArray< T > &op2)
MultidimArray(size_t Ndim, int Zdim, int Ydim, int Xdim)
friend MultidimArray< T > operator-(T op1, const MultidimArray< T > &op2)
There is not enough memory for allocation.
T interpolatedElementBSpline3D(double x, double y, double z, int SplineDegree=3) const
#define DIRECT_A2D_ELEM(v, i, j)
double correlationIndex(const MultidimArray< T > &x, const MultidimArray< T > &y, const MultidimArray< int > *mask=NULL, MultidimArray< double > *Contributions=NULL)
void maxIndex(size_t &lmax, int &kmax, int &imax, int &jmax) const
void computeAvgStdev(U &avg, U &stddev) const
void maxIndex(int &jmax) const
#define MULTIDIM_ARRAY(v)
void rangeAdjust(T minF, T maxF)
void operator/=(const T &op1)
int bestPrecision(float F, int _width)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY_ptr(v, n, ptr)
#define FOR_ALL_DIRECT_ELEMENTS_IN_ARRAY3D(V)
void swap(MultidimArray< T > &other) noexcept
Incorrect MultidimArray size.
void getCol(size_t j, MultidimArray< T > &v) const
Memory has not been deallocated.
String floatToString(float F, int _width, int _prec)
MultidimArray< T > operator/(const MultidimArray< T > &op1) const
void free_Tmatrix(T **&m, int nrl, int nrh, int ncl, int nch)
friend void coreScalarByArray(const T &op1, const MultidimArray< T > &op2, MultidimArray< T > &result, char operation)
void resize(const MultidimArray< T1 > &v, bool copy=true)
friend void coreArrayByArray(const MultidimArray< T > &op1, const MultidimArray< T > &op2, MultidimArray< T > &result, char operation)
void computeAvgStdev_within_binary_mask(const MultidimArray< int > &mask, double &avg, double &stddev) const
T *** adaptForNumericalRecipes3D(size_t n=0) const
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 FOR_ALL_ELEMENTS_IN_ARRAY2D(m)
void median(MultidimArray< T > &x, MultidimArray< T > &y, T &m)
void initLinear(T minF, T maxF, int n=1, const String &mode="incr")
void aliasSlice(const MultidimArray< T > &m, size_t select_slice)
void typeCast(const MultidimArray< T1 > &v1, MultidimArray< T2 > &v2)
void centerOfMass(Matrix1D< double > ¢er, void *mask=NULL, size_t n=0)
T interpolatedElement2D(double x, double y, T outside_value=(T) 0) const
void initZeros(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim)
MultidimArray< T > operator/(T op1) const
#define A3D_ELEM(V, k, i, j)
void selfWindow(int x0, int xF, T init_value=0)
void cutToCommonSize(MultidimArray< T > &V1, MultidimArray< T > &V2)
T * adaptForNumericalRecipes22D() const
MultidimArray(const std::vector< T > &vector)
void toPhysical(int i_log, int j_log, int &i_phys, int &j_phys) const
T & operator()(int i) const
#define DIRECT_A1D_ELEM(v, i)
#define checkDimension(dim)
void toPhysical(int k_log, int i_log, int j_log, int &k_phys, int &i_phys, int &j_phys) const
#define FOR_ALL_ELEMENTS_IN_ARRAY3D(V)
void rangeAdjust(T minF, T maxF, MultidimArray< int > &mask)
void addNoise(double op1, double op2, const String &mode="uniform", double df=3.) const
void log(Image< double > &op)
void window(MultidimArray< T1 > &result, int x0, int xF, T1 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
void computeMedian_within_binary_mask(const MultidimArray< int > &mask, double &median) const
void minIndex(int &kmin, int &imin, int &jmin) const
MultidimArray< T > operator-(const MultidimArray< T > &op1) const
bool equal(const MultidimArray< T > &op, double accuracy=XMIPP_EQUAL_ACCURACY) const
void initZeros(int Ydim, int Xdim)
void getSliceAsMatrix(size_t k, Matrix2D< T > &m) const
void binarize(double val=0, double accuracy=XMIPP_EQUAL_ACCURACY, MultidimArray< int > *mask=NULL)
void operator-=(const T &op1)
void rangeAdjust(const MultidimArray< T > &example, const MultidimArray< int > *mask=NULL)
void getAliasAsRowVector(Matrix1D< T > &m) const
void killAdaptationForNumericalRecipes2D(T **m) const
bool operator!=(const MultidimArray< T > &op1, const MultidimArray< T > &op2)
void profile(int x0, int y0, int xF, int yF, int N, MultidimArray< double > &profile) const
MultidimArray< T > operator*(T op1) const
Incorrect argument received.
void setSlice(int k, const MultidimArray< T1 > &v, size_t n=0)
MultidimArray(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, T *data)
#define XMIPP_EQUAL_ACCURACY
void setCol(size_t j, const MultidimArray< T > &v)
bool sameShape(const MultidimArrayBase &op) const
T & operator()(const Matrix1D< int > &v) const
MultidimArray(const MultidimArray< T > &V)
MultidimArray< T > & operator=(MultidimArray< T > &&other) noexcept
friend void coreArrayByScalar(const MultidimArray< T > &op1, const T &op2, MultidimArray< T > &result, char operation)
void operator*=(const T &op1)
void write(const FileName &fn) const
T * adaptForNumericalRecipes1D() const
void computeDoubleMinMax(double &minval, double &maxval) const
MultidimArray< T > & operator=(const MultidimArray< T > &op1)
#define FOR_ALL_DIRECT_ELEMENTS_IN_MULTIDIMARRAY(v)
void killAdaptationForNumericalRecipes3D(T ***m) const
void sincos(const MultidimArray< double > &x, MultidimArray< double > &s, MultidimArray< double > &c)
void initZeros(int Zdim, int Ydim, int Xdim)
MultidimArray< T > operator*(const MultidimArray< T > &op1) const
void equal(T op1, MultidimArray< char > &result) const
void checkDimensionWithDebug(int dim, const char *file, int line) const
void showWithGnuPlot(const String &xlabel, const String &title)
bool row
<0=column vector (default), 1=row vector
#define DIRECT_MULTIDIM_ELEM(v, n)
void operator/=(const MultidimArray< T > &op1)
T interpolatedElement3D(double x, double y, double z, T outside_value=(T) 0) const
void toPhysical(int i_log, int &i_phys) const
void randomSubstitute(T oldv, T avgv, T sigv, double accuracy=XMIPP_EQUAL_ACCURACY, MultidimArray< int > *mask=NULL)
#define ASSIGNVAL2D(d, i, j)
void log10(Image< double > &op)
void window2D(const MultidimArray< T > &Ibig, MultidimArray< T > &Ismall, size_t y0, size_t x0, size_t yF, size_t xF)
MultidimArray(int Zdim, int Ydim, int Xdim)
T & operator()(int k, int i, int j) const
void alias(const MultidimArray< T > &m)
double computeMedian() const
basic_istream< char, std::char_traits< char > > istream
void toLogical(int i_phys, int &i_log) const
T & operator[](size_t i) const
void mod(const MultidimArray< T > &x, MultidimArray< T > &m, double y)
void printStats(std::ostream &out=std::cout) const
#define NZYX_ELEM(v, l, k, i, j)
#define DIRECT_A3D_ELEM(v, k, i, j)
bool operator==(const MultidimArray< T > &op1, const MultidimArray< T > &op2)
void setDimensions(int Xdim, int Ydim, int Zdim, size_t Ndim)
T interpolatedElementBSpline2D(double x, double y, int SplineDegree=3) const
void getRow(size_t i, MultidimArray< T > &v) const
virtual void resize(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim, bool copy=true)=0
void operator-=(const MultidimArray< T > &op1)
void copyShape(const MultidimArrayBase &m)
void loadFromNumericalRecipes2D(T **m, int Ydim, int Xdim)
T ** adaptForNumericalRecipes2D(size_t n=0) const
size_t countThreshold(const String &type, T a, T b, MultidimArray< int > *mask=NULL)
void operator+=(const T &op1)
friend void MultidimArrayMax(const MultidimArray< T > &v1, const MultidimArray< T > &v2, MultidimArray< T > &result)
#define FOR_ALL_ELEMENTS_IN_ARRAY1D(v)
void selfWindow(int z0, int y0, int x0, int zF, int yF, int xF, T init_value=0)
void getReal(MultidimArray< double > &realImg) const
void toLogical(int k_phys, int i_phys, int j_phys, int &k_log, int &i_log, int &j_log) const
void window(MultidimArray< T1 > &result, int z0, int y0, int x0, int zF, int yF, int xF, T1 init_value=0) const
friend MultidimArray< T > operator+(T op1, const MultidimArray< T > &op2)
void reslice(MultidimArray< T1 > &out, AxisView face, bool flip=false, size_t n=0) const
#define DIRECT_ZYX_ELEM(v, k, i, j)
void ask_Tvolume(T ***&m, int nsl, int nsh, int nrl, int nrh, int ncl, int nch)
String formatString(const char *format,...)
void selfWindow(int y0, int x0, int yF, int xF, T init_value=0)
void killAdaptationForNumericalRecipes1D(T *m) const
T & operator()(int i, int j) const
void selfNormalizeInterval(double minPerc=0.25, double maxPerc=0.75, int Npix=1000)
void resizeNoCopy(int Xdim)
MultidimArray< T > operator+(T op1) const
void copy(Matrix2D< T > &op1) const
void aliasRow(const MultidimArray< T > &m, size_t select_row)
friend void arrayByScalar(const MultidimArray< T > &op1, T op2, MultidimArray< T > &result, char operation)
T interpolatedElement2DOutsideZero(double x, double y) const
void ask_Tmatrix(T **&m, int nrl, int nrh, int ncl, int nch)
Incorrect MultidimArray dimensions.
#define SPEED_UP_tempsInt
T * vdata
The array itself.
void computeDoubleMinMaxRange(double &minval, double &maxval, size_t offset, size_t size) const
#define FOR_ALL_ELEMENTS_IN_ARRAY2D_BETWEEN(corner1, corner2)
#define ASSIGNVAL2DNODIV(d, i, j)
double computeStddev() const
void initZeros(const MultidimArray< T1 > &op)
double computeAvg() const
void getImag(MultidimArray< double > &imagImg) const
MultidimArray< T > operator+(const MultidimArray< T > &op1) const
#define FOR_ALL_ELEMENTS_IN_COMMON_IN_ARRAY3D(V1, V2)
#define LIN_INTERP(a, l, h)
void selfCoreArrayByArrayMask(const MultidimArray< T > &op1, const MultidimArray< T > &op2, MultidimArray< T > &result, char operation, const MultidimArray< T > *mask)
virtual void maxIndex(size_t &lmax, int &kmax, int &imax, int &jmax) const =0
T interpolatedElement1D(double x, T outside_value=(T) 0) const
Incorrect value received.
bool destroyData
Destroy data.
friend void selfCoreArrayByArrayMask(const MultidimArray< T > &op1, const MultidimArray< T > &op2, MultidimArray< T > &result, char operation, const MultidimArray< T > *mask)
T & operator()(size_t n, int k, int i, int j) const
#define FOR_ALL_NZYX_ELEMENTS_IN_MULTIDIMARRAY(V)
friend std::istream & operator>>(std::istream &in, MultidimArray< T > &v)
friend void selfArrayByArrayMask(const MultidimArray< T > &op1, const MultidimArray< T > &op2, MultidimArray< T > &result, char operation, const MultidimArray< T > *mask=NULL)
void resizeNoCopy(size_t Ndim, size_t Zdim, size_t Ydim, size_t Xdim)
void coreArrayByArray(const MultidimArray< T > &op1, const MultidimArray< T > &op2, MultidimArray< T > &result, char operation)
void setRow(int i, const MultidimArray< T > &v)
void indexSort(MultidimArray< int > &indx) const
ql0001_ & zero(ctemp+1),(cvec+1),(a+1),(b+1),(bl+1),(bu+1),(x+1),(w+1), &iout, ifail, &zero,(w+3), &lwar2,(iw+1), &leniw, &glob_grd.epsmac
void statisticsAdjust(U avgF, U stddevF)
void * getArrayPointer() const
void getImage(size_t n, MultidimArray< T > &M, size_t n2=0) const
void coreArrayByScalar(const MultidimArray< T > &op1, const T &op2, MultidimArray< T > &result, char operation)
MultidimArray(MultidimArray< T > &&V) noexcept
void toLogical(int i_phys, int j_phys, int &i_log, int &j_log) const
size_t vdim
Number of elements.
__host__ __device__ float dot(float2 a, float2 b)
T & operator()(const Matrix1D< double > &v) const
MultidimArray(const Matrix1D< T > &V)