如果这个问题措辞不当或解决方案微不足道,请原谅我。我似乎找不到现有的答案,用我熟悉的术语进行搜索。
我有一系列非负浮动,我想将它们标准化 - 我能做的很多。我的问题是,我希望集合中所有元素的总和是特定的数量。
我可以设想实现这一目标的丑陋方法,但我知道那里有一个"对"实现这一目标的方法。目的是创建一个复合条形图,其总宽度必须固定。集合中的每个数据点都被赋予一个颜色,该颜色应该达到总条形图宽度的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的规则的必要性与图形绘制方法有关,在该方法上我具有有限的权限。
为了达到我想要的宽度(由此浮动集合驱动的图形视觉效果),所有元素的总和必须是特定数字,因此标准化。但是,元素的数量和它们的值都会发生变化,而且我不知道如何以任何其他方式补偿这一点。为了避免这种混乱,以任何其他方式缩放图形视觉效果是不可取的,因为许多无关紧要的原因。
答案 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)
可能有更精确的方法来解决这个问题,但是:
我没试过这个,只是在脑子里运行几个基本的例子,但它应该涵盖它。