28 #ifndef mrpt_math_container_ops_H
29 #define mrpt_math_container_ops_H
71 template<
class CONTAINER>
77 bool do_normalization =
false,
86 else H.
getHistogram( out_bin_centers ? *out_bin_centers : dummy_ret_bins, ret );
94 template <
class CONTAINER1,
class CONTAINER2>
95 inline void cumsum(
const CONTAINER1 &in_data, CONTAINER2 &out_cumsum)
97 out_cumsum.resizeLike(in_data);
99 const size_t N = in_data.size();
100 for (
size_t i=0;i<N;i++)
101 last = out_cumsum[i] = last + in_data[i];
106 template<
class CONTAINER>
107 inline CONTAINER
cumsum(
const CONTAINER &in_data)
119 template <
typename T>
inline T
maximum(
const std::vector<T> &v)
126 template <
typename T>
inline T
minimum(
const std::vector<T> &v)
141 for (
size_t i=0;i<2;i++) C.coeffRef(i,0)=p[i];
146 for (
size_t i=0;i<3;i++) C.coeffRef(i,0)=p[i];
151 for (
size_t i=0;i<3;i++) C.coeffRef(i,0)=p[i];
156 for (
size_t i=0;i<6;i++) C.coeffRef(i,0)=p[i];
161 for (
size_t i=0;i<7;i++) C.coeffRef(i,0)=p[i];
174 template <
class CONTAINER>
177 return total+v.squaredNorm();
182 template<
size_t N,
class T,
class U>
185 for (
size_t i=0;i<N;i++) res+=
square(v[i]);
190 template <
class CONTAINER1,
class CONTAINER2>
198 template<
size_t N,
class T,
class U,
class V>
201 for (
size_t i=0;i<N;i++) res+=v1[i]*v2[i];
211 template <
typename T>
inline T
sum(
const std::vector<T> &v) {
return std::accumulate(v.begin(),v.end(),T(0)); }
215 template <
class CONTAINER,
typename RET>
inline RET
sumRetType(
const CONTAINER &v) {
return v.sumRetType<RET>(); }
219 template <
class CONTAINER>
220 inline double mean(
const CONTAINER &v)
224 else return sum(v)/
static_cast<double>(v.size());
228 template <
typename T>
232 const size_t N=V.size();
234 for (
size_t i=1;i<N;i++)
242 template <
class Derived>
244 const Eigen::MatrixBase<Derived> &V,
248 V.minimum_maximum(curMin,curMax);
253 template <
class CONTAINER1,
class CONTAINER2>
259 if ( (*it1) == (*it2) )
265 template <
class CONTAINER>
268 if (
size_t(m.size())==0)
return;
272 m -= (curMin+minVal);
273 if (curRan!=0) m *= (maxVal-minVal)/curRan;
284 template<
class VECTORLIKE>
289 bool unbiased =
true)
294 out_mean = (v.size()==1) ? *v.begin() : 0;
299 const size_t N = v.size();
304 out_std = std::sqrt(vector_std / static_cast<double>(N - (unbiased ? 1:0)) );
314 template<
class VECTORLIKE>
315 inline double stddev(
const VECTORLIKE &v,
bool unbiased =
true)
328 template<
class VECTOR_OF_VECTOR,
class VECTORLIKE,
class MATRIXLIKE>
330 const VECTOR_OF_VECTOR &v,
331 VECTORLIKE &out_mean,
335 const size_t N = v.size();
336 ASSERTMSG_(N>0,
"The input vector contains no elements");
337 const double N_inv = 1.0/N;
339 const size_t M = v[0].size();
340 ASSERTMSG_(M>0,
"The input vector contains rows of length 0");
343 out_mean.assign(M,0);
344 for (
size_t i=0;i<N;i++)
345 for (
size_t j=0;j<M;j++)
346 out_mean[j]+=v[i][j];
353 for (
size_t i=0;i<N;i++)
355 for (
size_t j=0;j<M;j++)
356 out_cov.get_unsafe(j,j)+=
square(v[i][j]-out_mean[j]);
358 for (
size_t j=0;j<M;j++)
359 for (
size_t k=j+1;k<M;k++)
360 out_cov.get_unsafe(j,k)+=(v[i][j]-out_mean[j])*(v[i][k]-out_mean[k]);
362 for (
size_t j=0;j<M;j++)
363 for (
size_t k=j+1;k<M;k++)
364 out_cov.get_unsafe(k,j) = out_cov.get_unsafe(j,k);
373 template<
class VECTOR_OF_VECTOR>
374 inline Eigen::MatrixXd
covVector(
const VECTOR_OF_VECTOR &v )
389 template <
class CONT1,
class CONT2>
390 double ncc_vector(
const CONT1 &patch1,
const CONT2 &patch2 )
392 ASSERT_( patch1.size()==patch2.size() )
394 double numerator = 0, sum_a = 0, sum_b = 0, result, a_mean, b_mean;
395 a_mean = patch1.mean();
396 b_mean = patch2.mean();
398 const size_t N = patch1.size();
399 for(
size_t i=0;i<N;++i)
401 numerator += (patch1[i]-a_mean)*(patch2[i]-b_mean);
405 ASSERTMSG_(sum_a*sum_b!=0,
"Divide by zero when normalizing.")
406 result=numerator/std::sqrt(sum_a*sum_b);