C++ C+中是否有类似于numpy.logspace的内容+;?

C++ C+中是否有类似于numpy.logspace的内容+;?,c++,C++,正如标题所说,我正在寻找一些生成日志空间值的函数,就像numpy.logspace一样,但对于python。还有想法吗?标准库中没有这样的函数,但是,您可以轻松编写自己的函数。由于C++和Python的不同性质,函数不会是相同的。我建议使用生成器样式的函数对象: template<typename T> class Logspace { private: T curValue, base; public: Logspace(T first, T base) : cu

正如标题所说,我正在寻找一些生成日志空间值的函数,就像numpy.logspace一样,但对于python。还有想法吗?

标准库中没有这样的函数,但是,您可以轻松编写自己的函数。由于C++和Python的不同性质,函数不会是相同的。我建议使用生成器样式的函数对象:

template<typename T>
class Logspace {
private:
    T curValue, base;

public:
    Logspace(T first, T base) : curValue(first), base(base) {}

    T operator()() {
        T retval = curValue;
        curValue *= base;
        return retval;
    }
};

好的,我认为Erburat代码是错误的,但是从他提供的代码片段中很容易找到正确的代码。下面是generator+使用示例

Logspace
接受像
numpy.linspace
这样的参数,并将生成相同的序列。它可以过去。但是第一个值是相同的。它的工作原理就好像
端点
被设置为
True

#include<iostream>
#include<cmath> 

//for generator
#include<vector>
#include<algorithm>
#include<iterator>

template<typename T = double>
class Logspace {
private:
    T curValue, base, step;

public:
    Logspace(T first, T last, int num, T base = 10.0) : curValue(first), base(base){
       step = (last - first)/(num-1);
    }

    T operator()() {
        T retval = pow(base, curValue);
        curValue += step;
        return retval;
    }
};



int main(){
 int num = 4;
 Logspace<> generator(2, 3, 4, 2);
 for(int i = 0; i < num; ++i) std::cout << generator() << '\n';

 //
 std::cout << "1 to million\n";
 double start = 1;
 double stop = 6;
 num = 40;
 std::vector<double> vals;
 std::generate_n(std::back_inserter(vals), num, Logspace<>(start,stop,num));
 for(double num : vals) std::cout << num << '\n';

 return 0;
}
#包括
#包括
//发电机
#包括
#包括
#包括
模板
类日志空间{
私人:
T曲线值、基准、步长;
公众:
日志空间(T first,T last,int num,T base=10.0):曲线值(first),base(base){
步骤=(最后一个-第一个)/(num-1);
}
T运算符()(){
T retval=功率(基准、曲线值);
曲线值+=步长;
返回返回;
}
};
int main(){
int num=4;
日志空间生成器(2,3,4,2);

对于(int i=0;i < num;++i)STD::CUT IM相当C++初学者,但这只是“只是”计算一个数字的日志,对吗?我要找的是一个更像函数的东西,它包含MinValue、MaxValue和中间的箱子数。你可以使用这个对象。但是,如果没有
std::generate\u,直到
函数,你必须自己编写。对不起,我无法让它工作。你能等一下吗再给我一点?我需要40个从1到1E6的对数间隔的箱子。从这段代码开始编写一个箱子非常容易,它将模仿
numpy
一个。只需使用
start
stop
num
base
计算
start
stop
num
的步长。另外,您应该注意到当前示例中的
first
的含义与
numpy
中的含义不同,我认为这是错误的,应该是
curValue=pow(base,first)
。抱歉,我不明白。我将两个模板都添加到了标题中,但我收到了来自“vals.back\u inserter”的错误和logspace记住,
pow
是比乘法更昂贵的运算。@erburate是的,但是你想如何用简单的乘法计算
2^2.33
?我认为你的代码是错误的,因为你使用了错误的步骤。你的代码真的能重现预期的序列吗?在
linspace
中,步骤不是
1.0
。你可以输入
std::cout他的
realBase
值表示他正确使用的
pow(base,step_size)
。这样想:要从当前值到下一个值,你可以按顺序执行
next=pow(base,log(curr,base)+step)
可以扩展为
next=pow(base,log(curr,base))*pow(base,step)
再多走一步,你就可以得到
next=curr*pow(base,step)
。在他的代码中,
realValue=pow(base,step)
@GuyGreer他的评论是针对这样一个事实,即我的实现不是
numpy.logspace
函数的1:1副本。之后添加了
pyLogspace
函数。
std::vector<double> pyLogspace(double start, double stop, int num = 50, double base = 10) {
    double realStart = pow(base, start);
    double realBase = pow(base, (stop-start)/num);

    std::vector<double> retval;
    retval.reserve(num);
    std::generate_n(std::back_inserter(retval), num, Logspace<double>(realStart,realBase));
    return retval;
}
template<typename Value, typename OutputIt, typename Condition, typename Generator>
void generate_while(OutputIt output, Condition cond, Generator g) {
    Value val;
    while(cond(val = g())) {
        *output++ = val;
    }
}
#include<iostream>
#include<cmath> 

//for generator
#include<vector>
#include<algorithm>
#include<iterator>

template<typename T = double>
class Logspace {
private:
    T curValue, base, step;

public:
    Logspace(T first, T last, int num, T base = 10.0) : curValue(first), base(base){
       step = (last - first)/(num-1);
    }

    T operator()() {
        T retval = pow(base, curValue);
        curValue += step;
        return retval;
    }
};



int main(){
 int num = 4;
 Logspace<> generator(2, 3, 4, 2);
 for(int i = 0; i < num; ++i) std::cout << generator() << '\n';

 //
 std::cout << "1 to million\n";
 double start = 1;
 double stop = 6;
 num = 40;
 std::vector<double> vals;
 std::generate_n(std::back_inserter(vals), num, Logspace<>(start,stop,num));
 for(double num : vals) std::cout << num << '\n';

 return 0;
}