C#方法来缩放值?

Joh*_*n S 15 .net c# math

我的值范围是0到255.

有一种方法可以返回一个最小值和最大值在此范围内的数组,即:13,15,20,27,50 ... 240其中13是最小值,240是最大值

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

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

谢谢!

Gra*_*ton 21

使用此公式

y=mx+c
Run Code Online (Sandbox Code Playgroud)

在哪里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;
}
Run Code Online (Sandbox Code Playgroud)

  • 您应该真正检索指定数组的实际最小值和最大值,而不是指定244和13. (2认同)

dig*_*All 8

缩放范围内的值(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;
}
Run Code Online (Sandbox Code Playgroud)

从传入的数组中查找最小值和最大值

var min = Array.Min();
var max = Array.Max();
Run Code Online (Sandbox Code Playgroud)


Ada*_*son 5

IEnumerable<T>如果您使用 .NET 3.5,则 LINQ 可以轻松地从任何对象(数组)获取最小值和最大值。

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

int minValue = values.Min();
int maxValue = values.Max();
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找可以扩展整个阵列的东西......

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;
}
Run Code Online (Sandbox Code Playgroud)