2015-03-19 43 views
0

我想在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

編輯:

我應該已經解決了這個問題樂搶着計算器前多思考,這就是我其實並(通過this question啓發):

鑑於兩個界限firstlast,我想產生與first開始n -size陣列與last其中每個數組的結束元素是一些x的指數。

這種數學問題是一個簡單的串聯U(i)U(0) = first開始,以與U(n) = last結束U(i) = first * q^i(對於i在{0,1,...,N})和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; 
} 

這適用於任何符號相同雙打firstlast其中當然first < last,但它可以爲負first和積極last工作太稍加調整。

實施例:

爲第一= 50和LAST = 300 000和100層的元件陣列

Example

+1

僅供參考:語言*是* [Stata](http://en.wikipedia.org/wiki/Stata) – 2015-03-19 12:19:01

+1

@Nocle我的不好。 – 2015-03-19 15:10:08

+1

你在策劃什麼?你有1個1-d向量。 – 2015-03-19 16:04:32

回答

1

我假設你的意思是雙打(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 

在這個函數只產生遞增名單的那一刻(只是假設較小的值向左綁定)。有幾種方法可以使其在降序列表中工作(始終假定最左邊的參數是左邊界)。我只是想讓功能儘可能簡單,我認爲如果你理解了這個功能,那麼你可以很容易地添加這個功能。

+0

即使這不是我正在尋找,我感謝你的努力。 – Naucle 2015-03-19 15:56:33