如何规范化int值列表

时间:2009-08-04 09:47:41

标签: c# .net

我有一个int值列表:

  

List<int> histogram;

如何规范化所有值,使列表中的最大值始终为100?

3 个答案:

答案 0 :(得分:12)

迭代,找到最大值(称之为MAXVAL),然后再次迭代并将列表中的每个值乘以(100/MAXVAL)

var ratio = 100.0 / list.Max();
var normalizedList = list.Select(i => i * ratio).ToList();

答案 1 :(得分:8)

如果你有一个严格正数的列表,那么Dav的答案对你很好。

如果列表可以是任何数字,那么您还需要规范化到下限。

假设上限为100且下限为0,你会想要这样的......

var max = list.Max();
var min = list.Min();
var range = (double)(max - min);
var normalised 
    = list.Select( i => 100 * (i - min)/range)
        .ToList();

处理将min == max作为读者练习的案例......

答案 2 :(得分:7)

要标准化可能包含负值的一组数字,
并定义标准化比例的范围:

List<int> list = new List<int>{-5,-4,-3,-2,-1,0,1,2,3,4,5};
double scaleMin = -1; //the normalized minimum desired
double scaleMax = 1; //the normalized maximum desired

double valueMax = list.Max();
double valueMin = list.Min();
double valueRange = valueMax - valueMin;
double scaleRange = scaleMax - scaleMin;

IEnumerable<double> normalized = 
    list.Select (i =>
        ((scaleRange * (i - valueMin))
            / valueRange)
        + scaleMin);