Algorithm 将区间映射到较小区间的算法
我试图寻找,但由于我问题的性质,我无法找到令人满意的东西 我的问题是:我正在尝试将0到2000之间的数字(虽然理想情况下上限可以调整)映射到10到100之间的更小的间隔。上限将映射(2000->100)和下限。除此之外,在区间[0;2000]中大于另一个条目的条目理想情况下会大于[0;100]中的映射条目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]
我认为这个问题不是特定于语言的,但如果你想知道,我今天正在使用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; 而(i
b2),则为else 结果[i++]=s2; 其他的 结果[i]=(x-b1)/(b2-b1)*(s2[i]-s1[i])+s1[i++]; 返回(结果); } - 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
- 我认为,与其给你一个直接映射的公式,更好的方法是解释它背后的思想:
假设我们想把区间[0,1]映射到区间[1,3],这可以看作是找到f(x)=Ax+B的问题,这样从区间[0,1]中给出任何x,都会导致f(x)是区间[1,3]
从这个角度来看,我们已经知道了一些价值观:
在这种情况下,您现在应该具备将[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)