我有一组值(介于 -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/