17 const std::vector<double> & y,
const unsigned int polyorder,
const unsigned int loop,
const double eps
21 throw std::invalid_argument(
"BaselineModPoly(): the length of y is zero.");
25 throw std::invalid_argument(
"BaselineModPoly(): polyorder is zero.");
29 throw std::invalid_argument(
"BaselineModPoly(): loop is zero.");
33 throw std::invalid_argument(
"BaselineModPoly(): non-positive eps value is given.");
36 Eigen::VectorXd yy = Eigen::VectorXd::Map(y.data(), y.size());
37 Eigen::VectorXd x = Eigen::VectorXd::LinSpaced(y.size(), 0, 1);
39 Eigen::LDLT<Eigen::MatrixXd> ldltV = (V.transpose() * V).ldlt();
40 Eigen::VectorXd y_old = yy;
42 for(
unsigned int i = 0; i < loop; i++) {
43 Eigen::VectorXd y_new =
PolyVal(ldltV.solve(V.transpose() * y_old), V);
45 if((y_new - y_old).norm() / y_old.norm() < eps) {
49 y_old = (y_new.array() > y_old.array()).select(y_old, y_new);
52 std::vector<double> result(y.size());
53 Eigen::VectorXd::Map(result.data(), result.size()) = y_old;
const std::vector< double > BaselineModPoly(const std::vector< double > &y, const unsigned int polyorder, const unsigned int loop, const double eps)
Estimates the baseline using the Modified Polynomial (ModPoly) method.
const Derived::PlainObject PolyVal(const Eigen::MatrixBase< Derived > &coeff, const Eigen::MatrixX< typename Derived::PlainObject::Scalar > &V)
Evaluates the polynomial at specified points using a pre-calculated Vandermonde matrix.
const Eigen::MatrixX< typename Derived::PlainObject::Scalar > Vandermonde(const Eigen::MatrixBase< Derived > &x, const unsigned int polyorder)
Generates a Vandermonde matrix for a given vector and polynomial order.