18 const std::vector<double> & y,
const unsigned int m,
const bool decreasing,
23 throw std::invalid_argument(
"BaselineSnip(): the length of y is zero.");
26 if(y.size() < 2 * m) {
27 throw std::invalid_argument(
"BaselineSnip(): the length of y is shorter than 2 * m.");
31 throw std::invalid_argument(
"BaselineSnip(): m is zero.");
35 throw std::invalid_argument(
"BaselineSnip(): loop is zero.");
39 unsigned int n = (
unsigned int)y.size();
43 yy = Eigen::VectorXd::Map(y.data(), n).unaryExpr(
45 return x > 0 ? std::log(std::log(x + 1) + 1) : 0;
50 yy = Eigen::VectorXd::Map(y.data(), n).unaryExpr(
52 return x > 0 ? std::log(std::log(std::sqrt(x + 1) + 1) + 1) : 0;
57 yy = Eigen::VectorXd::Map(y.data(), n);
60 std::vector<unsigned int> index;
62 for(
unsigned int i = 0; i < m; i++){
63 index.emplace_back(decreasing ? (m - i) : (i + 1));
66 Eigen::VectorXd v = yy;
68 for(
unsigned int i = 0; i < loop; i++) {
70 Eigen::VectorXd v_prev = v;
72 for(
unsigned int k = j; k < n - j; k++) {
73 double ave = (v_prev(k + j) + v_prev(k - j)) / 2;
74 v(k) = std::min(v_prev(k), ave);
79 std::vector<double> result(v.size());
83 Eigen::VectorXd::Map(result.data(), result.size()) = v.unaryExpr(
85 return std::exp(std::exp(x) - 1) - 1;
90 Eigen::VectorXd::Map(result.data(), result.size()) = v.unaryExpr(
92 double t = std::exp(std::exp(x) - 1) - 1;
98 Eigen::VectorXd::Map(result.data(), result.size()) = v;
const std::vector< double > BaselineSnip(const std::vector< double > &y, const unsigned int m, const bool decreasing, const SnipPreprocess preprocess, const unsigned int loop)
Performs baseline estimation using the Statistics-sensitive Non-linear Iterative Peak-clipping (SNIP)...