阵列数据规范化

joe*_*ish 2 c# arrays

我有一个表示强度(黑到白)的值数组(介于-1.0和1.0之间).我需要一种方法将双值从-1.0到1.0映射到0到25​​5并返回.

更一般化,我有一个数据数组,我需要从数据的最小值和最大值映射到提供的最小值和最大值.基本结构应该是:

private static int[] NormalizeData(double[] data, int min, int max)
{
    var sorted = data.OrderBy(d => d);
    double dataMax = sorted.First();
    double dataMin = sorted.Last();
    int[] ret = new int[data.Length];

    for (int i = 0; i < data.Length; i++)
    {
        ret[i] = (int)data[i];  // Normalization here
    }

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

Cam*_*ron 7

这有效:

private static int[] NormalizeData(IEnumerable<double> data, int min, int max)
{
    double dataMax = data.Max();
    double dataMin = data.Min();
    double range = dataMax - dataMin;

    return data
        .Select(d => (d - dataMin) / range)
        .Select(n => (int)((1 - n) * min + n * max))
        .ToArray();
}
Run Code Online (Sandbox Code Playgroud)

第一个选择将输入归一化为0到1(0表示最小值,1表示最大值).第二个选择采用该标准化数字,并将其映射到新的最小值和最大值.

请注意,使用LINQ Min()Max()函数比为较大数据集排序输入要快:O(n)与O(n*lg(n)).

此外,如果你想走另一条路,那么你会希望它返回双打而不是整数.