28 #ifndef transform_gaussian_H
29 #define transform_gaussian_H
56 template <
class VECTORLIKE1,
class MATLIKE1,
class USERPARAM,
class VECTORLIKE2,
class VECTORLIKE3,
class MATLIKE2>
58 const VECTORLIKE1 &x_mean,
59 const MATLIKE1 &x_cov,
60 void (*functor)(
const VECTORLIKE1 &x,
const USERPARAM &fixed_param, VECTORLIKE3 &y),
61 const USERPARAM &fixed_param,
64 const bool *elem_do_wrap2pi = NULL,
65 const double alpha = 1e-3,
67 const double beta = 2.0
71 const size_t Nx = x_mean.size();
72 const double lambda = alpha*alpha*(Nx+K)-Nx;
73 const double c = Nx+lambda;
76 const double Wi = 0.5/c;
79 W_cov[0] = W_mean[0]+(1-alpha*alpha+beta);
83 const bool valid = x_cov.chol(L);
84 if (!valid)
throw std::runtime_error(
"transform_gaussian_unscented: Singular covariance matrix in Cholesky.");
90 VECTORLIKE1 X = x_mean;
91 functor(X,fixed_param,Y[0]);
95 for (
size_t i=0;i<Nx;i++)
97 L.extractRowAsCol(i,delta);
99 functor(X,fixed_param,Y[row++]);
101 functor(X,fixed_param,Y[row++]);
115 template <
class VECTORLIKE1,
class MATLIKE1,
class USERPARAM,
class VECTORLIKE2,
class VECTORLIKE3,
class MATLIKE2>
117 const VECTORLIKE1 &x_mean,
118 const MATLIKE1 &x_cov,
119 void (*functor)(
const VECTORLIKE1 &x,
const USERPARAM &fixed_param,VECTORLIKE3 &y),
120 const USERPARAM &fixed_param,
123 const size_t num_samples = 1000,
131 for (
size_t i=0;i<num_samples;i++)
132 functor(samples_x[i],fixed_param,samples_y[i]);
134 if (out_samples_y) { out_samples_y->clear(); samples_y.swap(*out_samples_y); }
144 template <
class VECTORLIKE1,
class MATLIKE1,
class USERPARAM,
class VECTORLIKE2,
class VECTORLIKE3,
class MATLIKE2>
146 const VECTORLIKE1 &x_mean,
147 const MATLIKE1 &x_cov,
148 void (*functor)(
const VECTORLIKE1 &x,
const USERPARAM &fixed_param,VECTORLIKE3 &y),
149 const USERPARAM &fixed_param,
152 const VECTORLIKE1 &x_increments
157 functor(x_mean,fixed_param,y_mean);
159 Eigen::Matrix<double,VECTORLIKE3::RowsAtCompileTime,VECTORLIKE1::RowsAtCompileTime> H;
161 H.multiply_HCHt(x_cov, y_cov);