我有一个表示强度(黑到白)的值数组(介于-1.0和1.0之间).我需要一种方法将双值从-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;
}
Run Code Online (Sandbox Code Playgroud)
这有效:
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)).
此外,如果你想走另一条路,那么你会希望它返回双打而不是整数.
归档时间: |
|
查看次数: |
9865 次 |
最近记录: |