代码之家  ›  专栏  ›  技术社区  ›  Naucle

生成指数间隔的数字列表

  •  1
  • Naucle  · 技术社区  · 10 年前

    我想在C++中生成一个指数间隔的数字列表,其中点的数量和边界是已知的(就像Matlab的linspace或logspace,或者Python的numpy.logspace)。我已经找到了对数间隔数字的几种实现(见下文),但想不出将它们转换为指数间隔数字的方法,此外,边界可以是负数。

    以下是我目前所发现的:

    Is there something like numpy.logspace in C++?

    EXPLIST: Stata module to generate an exponentially-spaced list of numbers (不知道这种语言实际上是什么)

    Generating a logarithmically spaced numbers

    编辑:

    我应该在赶去stackoverflow之前多思考一下这个问题,下面是我实际做的事情(灵感来自 this question ) :

    给定两个界限 first last ,我想生成 n -以开头的大小数组 第一 并以结尾 最后的 其中每个数组的元素是一些 x .

    这个数学问题是一个简单的系列 U(i) 开始于 U(0) = first 并以结尾 U(n) = last 具有 U(i) = first * q^i (对于{0,1,…,n}中的i)和 q = pow(last / first, 1 / (n - 1)) .

    以下是原始代码:

    #include <Eigen\Dense>
    
    using namespace Eigen;
    
    VectorXd expList(double first, double last, DenseIndex n)
    {
        VectorXd vector(n); // native C++ array or vector can be used of course
        double m = (double) 1 / (n - 1);
        double quotient = pow(last / first, m);
    
        vector(0) = first;
    
        for (DenseIndex i = 1; i < n; i++) // DenseIndex is just a typedef ptrdiff_t from the Eigen library
            vector(i) = vector(i - 1) * quotient;
    
        return vector;
    }
    

    这适用于任何相同的符号双打 第一 最后的 哪里 first < last 当然,但它可以用于否定 第一 和阳性 最后的 稍微调整一下也可以。

    例子:

    对于第一个=50,最后一个=300 000和100个元素阵列

    Example

    1 回复  |  直到 10 年前
        1
  •  2
  •   Corinna    10 年前

    我假设你的意思是一个双(d1,…,dn)列表,使得e^d(I+1)-e^di是常数? 在这种情况下,以下函数应满足您的要求:

    #include <vector>
    #include <math.h>
    #include <iostream>
    
    std::vector<double> explist(double first, double last, double size)
    {
        if(first>last) std::swap(first,last);
        double expfirst = exp(first);
        double explast = exp(last);
        double step = (explast-expfirst)/(size-1);
        std::vector<double> out;
        for(double x=expfirst; x<=explast; x+=step)
        {
            double a = log(x);
            out.push_back(a);
        }
        return out;
    }
    int main()
    {
        std::vector<double> test = explist(0,1,6);
        for(double d : test)
        {
            std::cout<<d<<" ";
        }
        std::cout<<std::endl;
        for(double d : test)
        {
            std::cout<<exp(d)<<" ";
    
        }
        std::cout<<std::endl;
    }
    

    输出:

    0 0.295395 0.523137 0.708513 0.86484 1
    1 1.34366 1.68731 2.03097 2.37463 2.71828
    

    目前,该函数只生成升序列表(它只是假设较小的值是左边界)。有几种方法可以使它也适用于降序列表(总是假设最左边的参数是左边界)。我只是想让这个功能尽可能简单,我想如果你理解这个功能,你很容易添加这个功能。