【发布时间】:2015-03-19 12:13:00
【问题描述】:
我想在 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-size 数组,该数组以first 开头,以last 结尾,其中每个数组的元素都是一些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 其中当然是 first < last,但它也可以用于负号 first 和正号 last,只需稍作调整即可。
示例:
对于第一个 = 50 和最后一个 = 300 000 和一个 100 个元素的数组
【问题讨论】:
-
仅供参考:语言是 Stata
-
你在策划什么黑客攻击?你有 1 个一维向量。
-
@FélixCantournet 如果您没有 x 数据,则 Excel 和 Matlab 会针对元素索引进行绘图。
-
@Naucle 从您链接的实际问题来看:您的资金相当于 pyLogspace(log10(10), log10(100), 9)。你所拥有的是一个日志空间。没有指数空间这样的东西。
-
@FélixCantournet 我从来没有提到过指数空间,我知道基本的数学。在这里,值是指数间隔的,这意味着两个连续值之间的距离呈指数增长,并且数组的自然对数是线性函数(log(first*q^i) ~ a + i * b)。顺便说一句,英语不是我的母语,我可能会误用术语。
标签: c++ generator exponential