我的问题是如何从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整除怎么办?
有有效的方法吗?
问候
答案 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的实现更简单。在这种情况下,我的答案唯一的兴趣(?)是对该过程进行另一种解释