17 const std::vector<double> & y,
const double lambda,
const double p,
const double k,
18 const unsigned int s,
const unsigned int loop,
const double eps
22 throw std::invalid_argument(
"BaselinePsalsa(): the length of y is zero.");
26 throw std::invalid_argument(
"BaselinePsalsa(): non-positive lambda value is given.");
30 throw std::invalid_argument(
"BaselinePsalsa(): non-positive p value is given.");
34 throw std::invalid_argument(
"BaselinePsalsa(): non-positive k value is given.");
38 throw std::invalid_argument(
"BaselinePsalsa(): s must be 1, 2 or 3.");
42 throw std::invalid_argument(
"BaselinePsalsa(): loop is zero.");
46 throw std::invalid_argument(
"BaselinePsalsa(): non-positive eps value is given.");
50 Eigen::VectorXd yy, w, w_old, z, pv(m), npv;
51 Eigen::SparseMatrix<double> I, D, lambdaDTD;
53 yy = Eigen::VectorXd::Map(y.data(), m);
58 npv = (1 - pv.array()).matrix();
63 lambdaDTD = lambda * (D.transpose() * D);
65 for(
unsigned int i = 0; i < loop; i++) {
68 pv = (yy - z).unaryExpr([&](
const double x) {
69 return p * std::exp(-x / k);
71 w = (yy.array() > z.array()).select(pv, npv);
73 if(((w.array() - w_old.array()).abs() < eps).all()) {
84 Eigen::VectorXd::Map(result.
baseline.data(), z.size()) = z;
85 Eigen::VectorXd::Map(result.
corrected.data(), z.size()) = yy - z;
const Derived::PlainObject Diff(const Eigen::MatrixBase< Derived > &m0, const int n=1, const Dir dir=Dir::RowWise)
Calculates the n-th discrete difference along the given axis.
const BaselineResult BaselinePsalsa(const std::vector< double > &y, const double lambda, const double p, const double k, const unsigned int s, const unsigned int loop, const double eps)
Performs baseline estimation using Peaked Signal’s Asymmetric Least Squares Algorithm (psalsa).
Baseline estimation using Peaked Signal’s Asymmetric Least Squares Algorithm(psalsa).
Return value structure for baseline estimation functions.
std::vector< double > baseline
std::vector< double > corrected
const std::vector< double > Whittaker(const std::vector< double > &y, const std::vector< double > &w, const double lambda, const unsigned int s)
Performs Whittaker smoothing (std::vector<double> version, with weights).
Smoothing using Whittaker smoother.