【问题标题】:How to normalize a list of int values如何规范化 int 值列表
【发布时间】:2011-11-03 09:27:21
【问题描述】:

我有一个 int 值列表:

List<int> histogram;

如何标准化所有值以使列表中的最大值始终为 100?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

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

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

    【讨论】:

    • 哦,最大值可以为0,所以你有100/0。
    • 是的,应该检查边界情况——尽管没有真正好的方法来“规范化”一个全为零的列表。
    • @Dav:最大值为零并不意味着列表中的每个条目都为零。
    • 正确,杰森,但我给出的解决方案无论如何都只适用于非负面列表。对于可以包含负值的列表,仍然存在边界情况,它只是变成 when min == max 而不是 when max == 0。
    【解决方案2】:

    如果你有一个严格的正数列表,那么 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 留给读者练习的情况......

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-11-17
        • 2015-05-24
        • 1970-01-01
        • 2013-06-04
        • 2012-01-03
        • 2015-10-04
        • 2012-04-06
        • 2018-03-27
        • 2020-12-11
        相关资源
        最近更新 更多