-2

例如,我有一个三个变量:“x”、“y”和“z”。它们都来自一定的范围{min, max}。现在,我想计算一个新变量,比如说 p = x + F*(yz),其中 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*(yz) 并且它需要适当地映射到它自己的范围内。我怎么做?

4

2 回答 2

0

如果您只想获取某个范围内的变量x并将其[A, B]缩放到不同的范围[C, D],那么您应该注意:

  1. x - A在范围内[0, B - A]
  2. 缩放范围内的数字[0, B - A]实际上与此问题中要解决的问题相同:如何从 rand() 中按比例缩小数字?.

请注意,如果您使用一些非常幼稚的技术,例如模运算符,您的映射中将出现非均匀分布。链接的问题包含一些合理的技术来实现最一致的映射。

在你的情况下,p是在范围内[min - max + min, max + max - min]

于 2013-06-21T17:35:39.387 回答
0

这取决于您的最小值和最大值是多少。例如,要在 0 和 1 之间映射 p:

if (p < 10)
    p /= 9.0f;

else if (p < 100)
    p /= 99.0f;

else if (p < 1000)
    p /= 999.0f;

等等...

于 2013-06-21T17:38:34.683 回答