将间隔映射到较小间隔的算法

时间:2012-10-17 09:24:36

标签: algorithm mapping distribution

我尝试搜索,但由于我的问题的性质,我无法找到令人满意的东西。

我的问题如下:我试图将范围从0到2000(尽管理想情况下上限可调)的数字映射到10到100之间的小得多的区间。上限将映射(2000-> ; 100)和下限。除此之外,一个大于区间[0; 2000]中另一个条目的条目理想情况下会大于[0; 100]中的映射条目

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

6 个答案:

答案 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. x = 0& f(0)= 1 => f(0)= A * 0 + B = 1 => B = 1
  2. x = 1& f(1)= 3 => f(1)= A * 1 + B = 3 - = A + 1 = 3 => A = 2
  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数据的优化方法, 此伪代码向您显示了地图功能的主要思想 的是:

  • 避免出现b1 - b2范围内的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)