我尝试搜索,但由于我的问题的性质,我无法找到令人满意的东西。
我的问题如下:我试图将范围从0到2000(尽管理想情况下上限可调)的数字映射到10到100之间的小得多的区间。上限将映射(2000-> ; 100)和下限。除此之外,一个大于区间[0; 2000]中另一个条目的条目理想情况下会大于[0; 100]中的映射条目
我认为这个问题不是特定于语言的,但如果你想知道,我今天正在使用Javascript。
答案 0 :(得分:39)
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)
答案 1 :(得分:5)
我认为,不是给你一个直接映射的公式,更好的方法是解释它背后的想法:
假设我们想要将区间[0,1]映射到区间[1,3],这可以看作是找到f(x)= Ax + B的问题,这样从区间[0给出任何x] 1],将导致f(x)为/导致区间[1,3]。
从这个角度来看,我们已经知道了一些价值观:
从(1)和(2),我们可以得出结论,将区间[0,1]映射到[1,3]的函数是f(x)= 2x + 1.
在你的情况下,你现在应该拥有所有必要的知识,能够将[0,2000]间隔映射到[10,100]。
答案 2 :(得分:2)
// Given a value from intervalA, returns a mapped value from intervalB.
function intervalicValueMap(intervalA, intervalB, valueIntervalA) {
var valueIntervalB = (valueIntervalA - intervalA[0]) * (intervalB[1] - intervalB[0])
/ (intervalA[1] - intervalA[0]) + intervalB[0];
valueIntervalB = Math.round(valueIntervalB); // Ommit rounding if not needed.
return valueIntervalB;
}
var intervalA = [100, 200];
var intervalB = [1, 10];
var valueIntervalA = 170;
var valueIntervalB = intervalicValueMap(intervalA, intervalB, valueIntervalA);
console.log(valueIntervalB); // Logs 7
答案 3 :(得分:1)
简单的线性映射会将x
映射到x*90/2000+10
。
答案 4 :(得分:0)
这可能是映射x数据的优化方法, 此伪代码向您显示了地图功能的主要思想 的是:
处理数组映射
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);
}
答案 5 :(得分:0)
使用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)