Algorithm 将区间映射到较小区间的算法

Algorithm 将区间映射到较小区间的算法,algorithm,mapping,distribution,Algorithm,Mapping,Distribution,我试图寻找,但由于我问题的性质,我无法找到令人满意的东西 我的问题是:我正在尝试将0到2000之间的数字(虽然理想情况下上限可以调整)映射到10到100之间的更小的间隔。上限将映射(2000->100)和下限。除此之外,在区间[0;2000]中大于另一个条目的条目理想情况下会大于[0;100]中的映射条目 我认为这个问题不是特定于语言的,但如果你想知道,我今天正在使用Javascript。一个简单的线性映射将x映射到x*90/2000+10 To map [A, B] --> [a, b]

我试图寻找,但由于我问题的性质,我无法找到令人满意的东西

我的问题是:我正在尝试将0到2000之间的数字(虽然理想情况下上限可以调整)映射到10到100之间的更小的间隔。上限将映射(2000->100)和下限。除此之外,在区间[0;2000]中大于另一个条目的条目理想情况下会大于[0;100]中的映射条目


我认为这个问题不是特定于语言的,但如果你想知道,我今天正在使用Javascript。

一个简单的线性映射将
x
映射到
x*90/2000+10

To map
[A, B] --> [a, b]

use this formula
(val - A)*(b-a)/(B-A) + a
正如在另一个答案中正确提到的,它是线性映射

基本上

y = m*x + c

c = intersection at y-axis
m = slope determined by two known point (A, a), (B, b) = (b-a)/(B-A)

这里有一个优化的方法来映射你的x数据, 这段伪代码向您展示了map函数的主要思想 即:

  • 避免x值超出b1-b2范围的问题
  • 处理数组映射

    function map(var x, var b1, var b2, var s1, var s2)
    {
        var i;
        var result;
    
        i = 0;
        while(i < sizeof(s2))
            if(x < b1)
                result[i++] = s1;
            else if (x > b2)
                result[i++] = s2;
            else
                result[i] = (x - b1) / (b2 - b1 ) * (s2[i] - s1[i]) + s1[i++];
        return (result);
    }
    
    函数映射(变量x、变量b1、变量b2、变量s1、变量s2)
    {
    var i;
    var结果;
    i=0;
    而(ib2),则为else
    结果[i++]=s2;
    其他的
    结果[i]=(x-b1)/(b2-b1)*(s2[i]-s1[i])+s1[i++];
    返回(结果);
    }
    

    • 我认为,与其给你一个直接映射的公式,更好的方法是解释它背后的思想:

      假设我们想把区间[0,1]映射到区间[1,3],这可以看作是找到f(x)=Ax+B的问题,这样从区间[0,1]中给出任何x,都会导致f(x)是区间[1,3]

      从这个角度来看,我们已经知道了一些价值观:

    • x=0&f(0)=1=>f(0)=A*0+B=1=>B=1
    • x=1&f(1)=3=>f(1)=A*1+B=3 A+1=3=>A=2
    • 从(1)和(2)中,我们可以得出结论,将区间[0,1]映射到[1,3]的函数是f(x)=2x+1


      在这种情况下,您现在应该具备将[02000]间隔映射到[10100]的所有必要知识。

      使用Python中的Numpy回答:

      import numpy as np  
      
      # [A, B]: old interval
      # [a, b] new interval
      new_value = np.interp(old_value, [A, B], [a, b])
      print(new_value)
      

      您的范围是整数还是实/浮/十进制?您是否需要源中的不同条目映射到目标中的不同条目?键入此问题后,我提出了一个(对我来说)可接受的解决方案:我计算了第一个条目在其间隔内的百分比值,然后把这个百分比转换成新的间隔。我最后做了一些看起来很相似的事情。上面有一个描述,但脚本如下:(nMinValue是B,nmaxontsize是A)
      var nPercentage=((修饰符nMinValue)/(nMaxValue-nMinValue))*100;var nFontSize=parseInt((nBiggestFont nSmallestFont)*(nPercentage/100)+nSmallestFont)
      
      import numpy as np  
      
      # [A, B]: old interval
      # [a, b] new interval
      new_value = np.interp(old_value, [A, B], [a, b])
      print(new_value)