【发布时间】:2021-02-25 02:47:24
【问题描述】:
目标
以下代码旨在从高斯分布中获取vector<vector<float> > 的随机数,并执行以下操作:
-
同时遍历向量的所有
n列,直到遇到第一个超过某个阈值的值。 -
继续迭代,直到 a) 您遇到超过该阈值的第二个值,使得该值来自与第一个找到的值不同的列,或者 b) 您超过某个最大迭代次数。
-
在 a) 的情况下,继续迭代直到 c) 找到超过阈值的第三个值,使得该值来自与第一个找到的值不同的列和第二个找到的值, 或 b) 您超过了 first 找到的值的某个最大迭代次数。在 b) 的情况下重新开始,除了这次从第一个找到的值之后的一行开始迭代。
-
在 c) 的情况下,将计数器加一,然后向前跳转一些
x行。在 d) 的情况下,重新开始,除了这次从第一个找到的值之后的一行开始迭代。
我如何做到这一点:
在我看来,最具挑战性的部分是确保所有三个值都由一个独特的列提供。为了解决这个问题,我使用了std::set。我遍历vector<vector<float> > 的每一行,然后遍历该行的每一列。我检查每一列是否有超过阈值的值,并将其列数存储在 std::set 中。
我继续迭代。如果我到达max_iterations,我会跳回到第一个找到的值之后,清空集合,然后重置计数器。如果std::set 的大小为3,我在计数器上加一。
我的问题:
此代码需要在大小为数十列和数十万到数百万行的多维向量上运行。到目前为止,这极其缓慢。如果可能的话,我想显着提高性能。
我的代码:
void findRate(float thresholdVolts){
set<size_t> cache;
vector<size_t> index;
size_t count = 0, found = 0;
for(auto rowItr = waveform.begin(); rowItr != waveform.end(); ++rowItr){
auto &row = *rowItr;
for(auto colnItr = row.begin(); colnItr != row.end(); ++colnItr){
auto &cell = *colnItr;
if(abs(cell/rmsVoltage) >= (thresholdVolts/rmsVoltage)){
cache.insert(std::distance(row.begin(), colnItr));
index.push_back(std::distance(row.begin(), colnItr));
}
}
if(cache.size() == 0) count == 0;
if(cache.size() == 3){
++found;
cache.clear();
if(std::distance(rowItr, output.end()) > ((4000 - count) + 4E+6)){
std::advance(rowItr, ((4000 - count) + 4E+6));
}
}
}
}
【问题讨论】:
标签: c++ algorithm statistics gaussian