107 std::size_t num_groups,
108 const Index_* group_size,
109 Output_* output_means,
110 Output_* output_variances,
112 Index_* valid_group_size)
114 std::fill_n(output_means, num_groups, 0);
115 std::fill_n(output_variances, num_groups, 0);
117 ::tatami_stats::internal::nanable_ifelse<Value_>(
120 std::fill_n(valid_group_size, num_groups, 0);
122 for (Index_ j = 0; j < num; ++j) {
124 if (!std::isnan(x)) {
126 output_means[b] += x;
127 ++valid_group_size[b];
130 internal::finish_means(num_groups, valid_group_size, output_means);
132 for (Index_ j = 0; j < num; ++j) {
134 if (!std::isnan(x)) {
136 auto delta = x - output_means[b];
137 output_variances[b] += delta * delta;
140 internal::finish_variances(num_groups, valid_group_size, output_variances);
143 for (Index_ j = 0; j < num; ++j) {
144 output_means[group[j]] += ptr[j];
146 internal::finish_means(num_groups, group_size, output_means);
148 for (Index_ j = 0; j < num; ++j) {
150 auto delta = ptr[j] - output_means[b];
151 output_variances[b] += delta * delta;
153 internal::finish_variances(num_groups, group_size, output_variances);
196 std::size_t num_groups,
197 const Index_* group_size,
198 Output_* output_means,
199 Output_* output_variances,
200 Index_* output_nonzero,
202 Index_* valid_group_size)
204 std::fill_n(output_means, num_groups, 0);
205 std::fill_n(output_nonzero, num_groups, 0);
206 std::fill_n(output_variances, num_groups, 0);
208 ::tatami_stats::internal::nanable_ifelse<Value_>(
211 std::copy_n(group_size, num_groups, valid_group_size);
213 for (Index_ j = 0; j < num_nonzero; ++j) {
215 auto b = group[index[j]];
216 if (!std::isnan(x)) {
217 output_means[b] += x;
218 ++(output_nonzero[b]);
220 --(valid_group_size[b]);
223 internal::finish_means(num_groups, valid_group_size, output_means);
225 for (Index_ j = 0; j < num_nonzero; ++j) {
227 if (!std::isnan(x)) {
228 auto b = group[index[j]];
229 auto delta = x - output_means[b];
230 output_variances[b] += delta * delta;
233 for (
decltype(num_groups) b = 0; b < num_groups; ++b) {
234 output_variances[b] += output_means[b] * output_means[b] * (valid_group_size[b] - output_nonzero[b]);
236 internal::finish_variances(num_groups, valid_group_size, output_variances);
239 for (Index_ j = 0; j < num_nonzero; ++j) {
240 auto b = group[index[j]];
241 output_means[b] += value[j];
244 internal::finish_means(num_groups, group_size, output_means);
246 for (Index_ j = 0; j < num_nonzero; ++j) {
247 auto b = group[index[j]];
248 auto delta = value[j] - output_means[b];
249 output_variances[b] += delta * delta;
251 for (
decltype(num_groups) b = 0; b < num_groups; ++b) {
252 output_variances[b] += output_means[b] * output_means[b] * (group_size[b] - output_nonzero[b]);
254 internal::finish_variances(num_groups, group_size, output_variances);
283 Index_ dim = (row ? mat.
nrow() : mat.
ncol());
284 Index_ otherdim = (row ? mat.
ncol() : mat.
nrow());
290 std::vector<Value_> xbuffer(otherdim);
291 std::vector<Index_> ibuffer(otherdim);
293 std::vector<Output_> tmp_means(num_groups);
294 std::vector<Output_> output_variances(num_groups);
295 std::vector<Index_> tmp_nonzero(num_groups);
296 std::vector<Index_> valid_group_size(sopt.
skip_nan ? num_groups : 0);
298 for (Index_ i = 0; i < len; ++i) {
299 auto range = ext->fetch(xbuffer.data(), ibuffer.data());
308 output_variances.data(),
311 valid_group_size.data()
314 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
315 output[g][i + start] = output_variances[g];
328 std::vector<variances::RunningSparse<Output_, Value_, Index_> > runners;
329 runners.reserve(num_groups);
330 std::vector<LocalOutputBuffer<Output_> > local_var_output;
331 local_var_output.reserve(num_groups);
332 std::vector<std::vector<Output_> > local_mean_output;
333 local_mean_output.reserve(num_groups);
335 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
336 local_var_output.emplace_back(thread, start, len, output[g]);
337 local_mean_output.emplace_back(len);
338 runners.emplace_back(len, local_mean_output.back().data(), local_var_output.back().data(), sopt.
skip_nan, start);
342 std::vector<Value_> xbuffer(len);
343 std::vector<Index_> ibuffer(len);
345 for (
int i = 0; i < otherdim; ++i) {
346 auto range = ext->fetch(xbuffer.data(), ibuffer.data());
347 runners[group[i]].add(range.value, range.index, range.number);
350 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
352 local_var_output[g].transfer();
361 std::vector<Value_> xbuffer(otherdim);
362 std::vector<Output_> tmp_means(num_groups);
363 std::vector<Output_> output_variances(num_groups);
364 std::vector<Index_> valid_group_size(sopt.
skip_nan ? num_groups : 0);
366 for (Index_ i = 0; i < len; ++i) {
367 auto ptr = ext->fetch(xbuffer.data());
375 output_variances.data(),
377 valid_group_size.data()
380 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
381 output[g][i + start] = output_variances[g];
388 std::vector<variances::RunningDense<Output_, Value_, Index_> > runners;
389 runners.reserve(num_groups);
390 std::vector<LocalOutputBuffer<Output_> > local_var_output;
391 local_var_output.reserve(num_groups);
392 std::vector<std::vector<Output_> > local_mean_output;
393 local_mean_output.reserve(num_groups);
395 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
396 local_var_output.emplace_back(thread, start, len, output[g]);
397 local_mean_output.emplace_back(len);
398 runners.emplace_back(len, local_mean_output.back().data(), local_var_output.back().data(), sopt.
skip_nan);
401 std::vector<Value_> xbuffer(len);
404 for (Index_ i = 0; i < otherdim; ++i) {
405 auto ptr = ext->fetch(xbuffer.data());
406 runners[group[i]].add(ptr);
409 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
411 local_var_output[g].transfer();