将值映射到某个范围

mapping value to a certain range

本文关键字:范围 映射      更新时间:2023-10-16

例如,我有三个变量:"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],那么你应该注意:

  1. x - A[0, B - A]范围内。
  2. 缩放[0, B - A]范围内的数字实际上是在这个问题中解决的相同问题:我如何从rand()中缩放数字?

请注意,如果您使用一些非常简单的技术,如模数运算符,您将在映射中获得非均匀分布。链接的问题包含一些合理的技术,用于实现几乎一致的映射。

在您的示例中,p[min - max + min, max + max - min]范围内。