Метод C# для масштабирования значений?

У меня есть диапазон значений от 0 до 255.

Существует метод, который возвращает массив с минутой и макс. значениями в этом диапазоне, т.е.: 13, 15, 20, 27, 50... 240 то, где 13 минута и 240, является макс.

Я должен масштабировать эти значения так, чтобы 13 стал 0, и 240 становится 255, и масштабируйте все другие значения между ними пропорционально.

Есть ли какой-либо метод C#, который делает это?

спасибо!

15
задан John S 20 April 2010 в 12:51
поделиться

3 ответа

Используйте эту формулу

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;
}
21
ответ дан 1 December 2019 в 01:45
поделиться

Если вы используете .NET 3.5, то LINQ может легко получить минимальные и максимальные значения из любого объекта IEnumerable , которым является массив.

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;
}
4
ответ дан 1 December 2019 в 01:45
поделиться

Для масштабирования значения в диапазоне (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;
}

Для нахождения min и max из входящего массива

var min = Array.Min();
var max = Array.Max();
8
ответ дан 1 December 2019 в 01:45
поделиться