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

本文关键字:元素 规范化 点集 集合 | 更新日期: 2023-09-27 18:37:21

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

我有一个非负浮点数数组,我想对它们进行规范化 - 我能做的很多。 我的问题是,我希望集合中所有元素的总和是特定的数量。

我可以设想实现这一点的丑陋方法,但我只知道有一种"正确"的方法来实现这一点。 目的是创建一个复合条形图,其总宽度必须固定。 集合中的每个数据点都被分配了一种颜色,该颜色应获得总条形图宽度的 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

我非常感谢任何帮助,


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

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

为了达到我想要的宽度(由这个浮点集合驱动的图形视觉对象),所有元素的总和必须是一个特定的数字,因此规范化。 但是,元素的数量及其值都会发生变化,我不清楚如何以其他方式补偿这一点。 出于许多无关的原因,以任何其他方式缩放图形视觉对象以避免这种混乱是不可取的。

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

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

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
*/

我相信数学方程将是

s= s0 + s1 + s2 + ...

a= 尺寸/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 对整个集合进行归一化
  • 将规范化集的总和计算为 Sum。
  • 将每个项目乘以(所需总和/总和)

我还没有尝试过这个,只是在我的脑海中运行了几个基本的例子,但它应该涵盖它。