如何从向量中提取n个样本?

时间:2018-11-07 07:48:39

标签: c++ vector sampling

我的问题是如何从vec.begin()vec.end()中选择n个元素,以使我们几乎覆盖所有矢量元素?

vector<double> take_100_samples(vector<double>& in)
{
  vector<double> vec(100);
  double step = (in.size() - 1) / (100 - 1);

// sampling process

  return vec;
} 

例如,如果in向量的大小为200,我们选择它的每两个元素(即in[0]in[2]in[4],...,{{ 1}}),但是如果大小不能被100整除怎么办?

有有效的方法吗?
问候

2 个答案:

答案 0 :(得分:2)

通常的方法是获取浮点分数,然后将其舍入为整数:

double step = in.size() / 100.;

for(int i = 0; i < 100; ++i)
{
    auto index = std::lround(i * step);
    // use index
}

当然,如果要一直获取第一个和最后一个元素,请像执行循环一样调整步长计算。

答案 1 :(得分:0)

我的解释是,您想对异步频率的信号进行下采样。<​​/ p>

一种实现方法是实现一种数字PLL(锁相环)。

让我们假设您输入的N = 1030个元素,而您想获得K = 100个元素。
平均费率等于 rate = 10.3 。 实际上,根据索引的当前位置,您将必须使用等于10或11的步长。

如果您处于“高级”状态:step = 10(减速)
如果您是“晚期”:step = 11(加速)

测试一下是否要迟到或提前:
当前的“读取”索引 i 等于先前步骤的总和。 k 是输出索引
如果 i :您迟到了
否则你会提前

这是基本思想。可以进行一些小的修改,例如以确保获取最后一个元素。

编辑:我只是“重新发现”了Mathieu Brucher的解决方案。在我第一次太快阅读它的过程中,我被他的答案中步骤计算的原始错误(已更正)所误导。显然,结果是相同的,只是Mathieu Brucher的实现更简单。在这种情况下,我的答案唯一的兴趣(?)是对该过程进行另一种解释