我正在处理[minValue,maxValue]之间的值,我想创建一个介于此范围之间的值向量。但是我想要更接近minValue的值。
示例:
min = 1 max = 100
vector = [1,1.1,1.5,2,3,5,10,15,30,50,100];
类似的东西。
目标是在最小值附近更准确。
可以实现吗?
答案 0 :(得分:3)
您可以通过使用常量步长(例如0.1)生成从0到1的数字开始。然后使用一些指数为它们供电 - 更大的指数,更锐利的曲线。然后移动并乘以进入所需的最小 - 最大范围。
伪代码:
min = 1.0
max = 100.0
exponent = 2.0 // Sharpness
result = []
for(i = 0.0; i <= 1.0; i += 0.1) {
result.push(pow(i, exponent) * (max - min) + min)
}
答案 1 :(得分:1)
我遇到了同样的问题。我想要很好的间隔点,但是在最小值附近有更多的点。我用了对数变换。首先是代码:
function SampleData (min, max, points) {
min = min || 1; // Minimum value
max = max || 1600; // Maximum value
points = points || 20; // data points between Min&Max
var step = (Math.log(max)-Math.log(min))/(points-1);
var data = [];
var D= 100; // max asy
var A= 0; // min asy
var C= 50; // inflectio
var B= 1; // Hills slope
for (i = Math.log(min); i <= Math.log(max); i=i+step) {
data.push ([Math.exp(i), math.eval (D+'+('+A+'-'+D+')/(1+('+math.exp(i)+'/'+C+')^'+B+')')]);
}
}
我使用的技巧是使用对数函数压缩数据范围(此处为1到1600);因此,我能够使用线性恒定步长。在将x值输入数学函数之前,必须返回变换(math.exp)值。
math.eval中的函数是一个相当复杂的4参数逻辑拟合,你当然可以使用别的东西。
在图像中,您可以看到上述函数的图表,一次是线性步长(橙色),一次是我的对数步长(红色)。 Visualisation of linear and logarithmic step width in data sampling.