如何规范化浮点集合,使所有元素的总和为X.

时间:2015-01-13 22:52:34

标签: c# floating-point normalization

如果这个问题措辞不当或解决方案微不足道,请原谅我。我似乎找不到现有的答案,用我熟悉的术语进行搜索。

我有一系列非负浮动,我想将它们标准化 - 我能做的很多。我的问题是,我希望集合中所有元素的总和是特定的数量。

我可以设想实现这一目标的丑陋方法,但我知道那里有一个"对"实现这一目标的方法。目的是创建一个复合条形图,其总宽度必须固定。集合中的每个数据点都被赋予一个颜色,该颜色应该达到总条形图宽度的N%。我通过图表显示方法限于这种方法。

如果需要代码,

首选C#示例。

// normalize data        
var ratio = 100.0 / widths.Max();
var normalizedList = widths.Select(o => o * ratio).ToList();
// magic happens here such that the sum of all elements is N
// and the relative scale of each sibling element is preserved

我非常感谢你的帮助,


其他信息: 该图是复合(分段)条形图。 float集合的每个元素对应一个段。 http://oi62.tinypic.com/2vskt8m.jpg

所有元素之和为N的规则的必要性与图形绘制方法有关,在该方法上我具有有限的权限。

为了达到我想要的宽度(由此浮动集合驱动的图形视觉效果),所有元素的总和必须是特定数字,因此标准化。但是,元素的数量和它们的值都会发生变化,而且我不知道如何以任何其他方式补偿这一点。为了避免这种混乱,以任何其他方式缩放图形视觉效果是不可取的,因为许多无关紧要的原因。

3 个答案:

答案 0 :(得分:3)

我相信数学方程式

  

s = s0 + s1 + s2 + ...

     

a = size / s

     

a * s = a *(s0 + s1 + s2 + ...)

     

a * s = a * s0 + a * s1 + a * s2 + ...

所以这应该解决问题

        var total = widths.Sum();
        var size=100;
        var ratio = size/total; //a in the equation
        var normalizedList = widths.Select(o => o * ratio).ToList();

        var normalSum = normalizedList.Sum(); //should be equal to size

答案 1 :(得分:3)

我认为你的比例有点错误。你需要的是你想要的总数除以所有元素的总和。例如

int desiredTotal = 300; 

float[] widths = new float[] { 35f, 63f, 12f };

float ratio = desiredTotal / widths.Sum();
var normalizedList = widths.Select(o => o * ratio).ToList();

foreach (var item in normalizedList)
{
    Console.WriteLine(item);
}

Console.WriteLine(normalizedList.Sum());

/* Which prints:
95.45454
171.8182
32.72727
300
*/

答案 2 :(得分:0)

可能有更精确的方法来解决这个问题,但是:

  • 基于1
  • 标准化整个集合
  • 将标准化集合的总和计算为Sum。
  • 将每个项目乘以(DesiredSum / Sum)

我没试过这个,只是在脑子里运行几个基本的例子,但它应该涵盖它。