66 auto dim = (row ? mat.
nrow() : mat.
ncol());
67 auto otherdim = (row ? mat.
ncol() : mat.
nrow());
71 std::fill_n(output, dim, std::numeric_limits<Output_>::quiet_NaN());
75 auto initialize = [&](
76 std::optional<quickstats::SingleQuantileFixedNumber<Output_, Index_> >& fixed,
77 std::optional<quickstats::SingleQuantileVariableNumber<Output_, Index_> >& variable
80 variable.emplace(otherdim, quantile);
82 fixed.emplace(otherdim, quantile);
94 auto vbuffer = buffer.data();
96 std::optional<quickstats::SingleQuantileFixedNumber<Output_, Index_> > qcalcs_fixed;
97 std::optional<quickstats::SingleQuantileVariableNumber<Output_, Index_> > qcalcs_var;
98 initialize(qcalcs_fixed, qcalcs_var);
100 for (Index_ x = 0; x < l; ++x) {
101 auto range = ext->fetch(vbuffer, NULL);
104 ::tatami_stats::internal::nanable_ifelse<Value_>(
107 auto lost = shift_nans(vbuffer, range.number);
108 output[x + s] = (*qcalcs_var)(otherdim - lost, range.number - lost, vbuffer + lost);
111 output[x + s] = (*qcalcs_fixed)(range.number, vbuffer);
123 std::optional<quickstats::SingleQuantileFixedNumber<Output_, Index_> > qcalcs_fixed;
124 std::optional<quickstats::SingleQuantileVariableNumber<Output_, Index_> > qcalcs_var;
125 initialize(qcalcs_fixed, qcalcs_var);
127 for (Index_ x = 0; x < l; ++x) {
128 auto bufptr = buffer.data();
129 auto raw = ext->fetch(bufptr);
132 ::tatami_stats::internal::nanable_ifelse<Value_>(
135 auto lost = shift_nans(bufptr, otherdim);
136 output[x + s] = (*qcalcs_var)(otherdim - lost, bufptr + lost);
139 output[x + s] = (*qcalcs_fixed)(bufptr);
void apply(bool row, const tatami::Matrix< Value_, Index_ > &mat, const double quantile, Output_ *output, const Options &qopt)
Definition quantiles.hpp:65
std::vector< Output_ > by_column(const tatami::Matrix< Value_, Index_ > &mat, const double quantile, const Options &qopt)
Definition quantiles.hpp:163
std::vector< Output_ > by_row(const tatami::Matrix< Value_, Index_ > &mat, const double quantile, const Options &qopt)
Definition quantiles.hpp:185
auto consecutive_extractor(const Matrix< Value_, Index_ > &matrix, const bool row, const Index_ iter_start, const Index_ iter_length, Args_ &&... args)