17 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()) {
80 std::vector<double> result(z.size());
81 Eigen::VectorXd::Map(result.data(), result.size()) = 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 std::vector< double > BaselinePsalsa(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).
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).