gpt4 book ai didi

c++ - 生成一定范围内的 float 序列

转载 作者:太空狗 更新时间:2023-10-29 19:52:21 24 4
gpt4 key购买 nike

我要填写一个vector<float>具有值,从 a 开始, 增加 inc , 直至并包括 b .所以基本上是什么vec = 2:0.5:4在 Matlab 中会做 - vec现在应该是 { 2.0, 2.5, 3.0, 3.5, 4.0 } .

我能想到的最好的是

vector<float> vec(10);
float increment = 0.5f;
std::generate(begin(vec), end(vec), [&increment]() {static float start = 2.0f; return start += increment ; });

但显然它是不正确的,因为它从 2.5f 开始,而不是 2.0f。我想更简单或更简洁地指定参数。

我可以想象在专门的类(class)中完成它,但这需要相当多的代码。我也看过 std::iota,但它只能增加 +1 .

关于最佳、简洁的方法有什么想法吗?欢迎使用 C++11(以及 14 的某些部分)。

编辑:当然,我也使用了一个 for 循环,例如:

    for (float i = -1.0f; i <= 1.0f; i += 0.05f) {
vec.emplace_back(i);
}

但它有一个问题,它有时不会达到最终值,如本例所示,因为 float 不精确(或者更确切地说是表示)。解决这个问题需要一些代码,我认为应该有更简洁的方法?

最佳答案

您可以编写自己的 std::iota 变体这也接受一个跨步参数。

template<typename ForwardIterator, typename T>
void strided_iota(ForwardIterator first, ForwardIterator last, T value, T stride)
{
while(first != last) {
*first++ = value;
value += stride;
}
}

在您的示例中,您会将其用作

std::vector<float> vec(10);
strided_iota(std::begin(vec), std::next(std::begin(vec), 5), 2.0f, 0.5f);

Live demo

关于c++ - 生成一定范围内的 float 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26980439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com