c# - 数组数据归一化

标签 c# arrays

我有一组值(介于 -1.0 和 1.0 之间)代表强度(黑色到白色)。我需要一种方法将 double 值从 -1.0 到 1.0 映射到 0 到 255 并返回。

更概括地说,我有一个数据数组,我需要将数据的最小值和最大值映射到提供的最小值和最大值。基本结构应该是这样的:

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;
}

最佳答案

这个有效:

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();
}

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

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

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

关于c# - 数组数据归一化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5383937/

相关文章:

javascript - 我怎样才能在Javascript中获得可变长度数组的前3个元素

c++ - 使用 C++ 的矩阵代数

基于另一个数组的 Java 打印数组

c# - 如何获取.Net Core中进程的CPU使用率和虚拟内存?

c# - 如何修复 “A reference to ' Audio Precision AP2700 3.00对象库'无法添加”

c# 主构造函数(实验特性)

c - C中sprintf的段错误

c# - 绑定(bind)到 iOS 静态库时从 Monotouch 访问 Objective-C 结构

c# - 更新二进制文件信息

Java - 用传统方式求和大整数