2010-04-20 63 views
13

我具有值范围从0到255C#方法来缩放值?

存在与该范围内的最小值和最大值返回一个阵列的方法,即:13,15,20,27,50 ... 240 其中13是最小值,240是最大值

我需要缩放这些值,使13变为0,240变为255,并按比例缩放它们之间的所有其他值。

是否有任何C#方法可以做到这一点?

谢谢!

+1

我们是否假设你是厕所国王得到一系列的浮游物? – 2010-04-20 12:53:47

+0

是的,我忘了提及...该方法将收到该数组并返回一个新的缩放。 – 2010-04-20 12:54:51

回答

18

使用这个公式

y=mx+c 

其中m = (255-0)/(244-13)c= -13*m

所以,你必须只变换数组作为这样

public double[] GetScaling(double[] arr, double min, double max) 
{ 
    double m = (max-min)/(arr.Max()-arr.Min()); 
    double c = min-arr.Min()*m; 
    var newarr=new double[arr.Length]; 
    for(int i=0; i< newarr.Length; i++) 
     newarr[i]=m*arr[i]+c; 
    return newarr; 
} 
+2

而不是指定244和13,你应该真的检索指定数组的实际最小值和最大值。 – 2010-04-20 13:01:45

+0

@ccomet,这应该是微不足道的 – Graviton 2010-04-20 13:03:01

+0

@ccomet,更新以使代码段更一般化。 – Graviton 2010-04-20 13:24:45

4

如果您使用.NET 3.5,然后LINQ可以很容易地从数组中的任何IEnumerable<T>对象中获取最小值和最大值。

int[] values = new int[] { 0, 1, 2, ... 255 }; 

int minValue = values.Min(); 
int maxValue = values.Max(); 

如果你正在寻找的东西来缩放全阵列...

public static int[] Scale(int[] values, int scaledMin, int scaledMax) 
{ 
    int minValue = values.Min(); 
    int maxValue = values.Max(); 

    float scale = (float)(scaledMax - scaledMin)/(float)(maxValue - minValue); 
    float offset = minValue * scale - scaledMin; 

    int[] output = new int[values.Length]; 

    for (int i = 0; i < values.Length; i++) 
    { 
     output[i] = (int)Math.Round(values[i] * scale - offset, 0); 
    } 

    return output; 
} 
+0

他知道最大值和最小值。他希望将中间的值转换为0到255之间的数值。 – 2010-04-20 12:56:56

+0

@Daniel:无论他是否知道值,构建可重用的方法都是很好的做法。 – fearofawhackplanet 2010-04-20 13:08:25

+0

@fearofawhackplanet:我的评论仅适用于问题的第一个版本,它只是说如何找到最大值和最小值,而不是缩放比例。有趣的是,这个版本只存在于我的梦中:http://stackoverflow.com/posts/2675221/revisions – 2010-04-20 13:28:37

4

要在范围刻度值(minScale,maxScale)

private double Scale(int value , int min, int max, int minScale, int maxScale) 
{ 
    double scaled = minScale + (double)(value - min)/(max-min) * (maxScale - minScale); 
    return scaled; 
} 

要找到分钟和来自阵列的最大值

var min = Array.Min(); 
var max = Array.Max();