将值映射到某个范围
mapping value to a certain range
例如,我有三个变量:"x", "y"answers"z"。它们都在一定范围内{min, max}。现在,我想计算一个新变量,假设p = x + F*(y-z)其中F是0到1之间的某个常数。这个新的计算变量"p"需要映射到上面的{min, max}范围。我怎么做呢?
编辑1
生成数字到数组:
population[D*id]=0;
population[D*id+N]=0;
population[D*id +2*N]=0;
population[D*id+1]=rndFloat(globalState,threadIdx.x,4);
population[D*id+N+1]=0;
population[D*id +2*N+1]=0;
for(int i=2; i<N; i++){
float min= -4 - 1/4*abs((int)((i-4)/3));
float max= 4 + 1/4*abs((int)((i-4)/3));
if(i==2)
{
population[D*id+2]=rndFloat(globalState,threadIdx.x,3.14159265359);
population[D*id+N+2]=rndFloat(globalState,threadIdx.x,min,max);
population[D*id +2*N+2]=0;
}
else
{
population[D*id +i]=rndFloat(globalState,threadIdx.x,min,max);
population[D*id+N+i]=rndFloat(globalState,threadIdx.x,min,max);
population[D*id +2*N+i]=rndFloat(globalState,threadIdx.x,min,max);
}
}
计算一个新变量:
for(int i=0; i<D-1; i++)
{
pop[D*id+i]= population[D*a +i] + F*(population[D*b +i]-population[D*c +i]);
}
索引a、b和c是随机选取的。需要注意的重要事项是最小和最大范围及其与给定索引的依赖关系:
float min= -4 - 1/4*abs((int)((i-4)/3));
float max= 4 + 1/4*abs((int)((i-4)/3));
,其中I被每个范围的a, b和c替换。
编辑2
为了简化,我们假设有3个变量x, y和z在一定范围内。每个变量都有自己的范围。我想计算新变量p = x + F*(y-z)它需要适当地映射到它自己的范围。我怎么做呢?
这取决于你的最小值和最大值是多少。例如,要在0和1之间映射p:
if (p < 10)
p /= 9.0f;
else if (p < 100)
p /= 99.0f;
else if (p < 1000)
p /= 999.0f;
如果你只是想取一些在[A, B]
范围内的变量x
,并将其缩放到不同的范围[C, D]
,那么你应该注意:
-
x - A
在[0, B - A]
范围内。 - 缩放
[0, B - A]
范围内的数字实际上是在这个问题中解决的相同问题:我如何从rand()中缩放数字?
请注意,如果您使用一些非常简单的技术,如模数运算符,您将在映射中获得非均匀分布。链接的问题包含一些合理的技术,用于实现几乎一致的映射。
在您的示例中,p
在[min - max + min, max + max - min]
范围内。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何在C++中访问有序映射中的键的范围/间隔?
- 迭代嵌套映射与范围为循环:没有名为"first"的成员
- 将整数范围映射到另一个范围
- 在C++或Python中,将浮点值映射到指定范围内的新值
- 将矢量映射到特定范围
- 定义基于模板的映射指针,以便在验证范围时将 int 解析为枚举
- c++将大型数字字符串映射到数字字符串范围
- C++ 映射擦除范围
- 整数宇宙映射数组到固定范围的应用与实现
- 将值映射到某个范围
- 在映射中存储一定范围内的值
- 如何在std::set中获得给定下界和上界的映射中的值范围?
- 如何使用基于范围的for循环修改映射中的值
- 在从一个范围映射到另一个范围时避免重复值
- 将有符号整数范围映射为无符号
- 以将阵列中的数字范围映射为均匀随机1到100