在Win 7上,通过Visual Studio中的C#,我需要计算大量数字的平均值和标准偏差。 这些数字是从文件中读取的。 可能有十万甚至更多的数字。 如果我不想将它们保存在一个数组结构(如数组或列表)中,因为这可能不是有效的内存,如何有效地进行计算。
我也需要打印数字到一个文件。
如何计算标准偏差[数组]的答案不能帮助。
任何帮助,将不胜感激 !
最好
万数不算什么 几百万就足以让你想起记忆,但是可能还不足以让你把所有的记忆都记下来。
如果你达到数十亿,万亿甚至更多,那么你到了可能无法把它们拉回到记忆的地步。 看起来你还没到那个地步。
你可以把它们全部放入一个List
,不需要担心。
话虽如此,LINQ的Average
方法实际上并不需要急切地加载所有数字来计算平均值; 它可以使用“当前”项修改一个聚合值,然后丢弃它,所以它的内存占用非常低。 在问题中链接到的所有StdDev方法都可以这样说; 他们都有一个小的不断的内存足迹。
所以你所要做的就是创建一个IEnumerable<double>
,它表示从文件中延伸出来的数字序列,然后你可以调用这些方法。 没有必要急于将它们加载到内存中。
计算一次处理一个数字时的平均值和标准偏差:
初始化Count
, Sum
和SumOfSquares
为零。
当您收到每个号码时,请将一个号码添加到Count
,将该号码添加到Sum
,然后将该号码的平方加到SumOfSquares
。
当您处理Math.Sqrt(SumOfSquares / Count - Mean * Mean)
每个数字后,将Mean
设置为Sum / Count
,并将StandardDeviation
设置为Math.Sqrt(SumOfSquares / Count - Mean * Mean)
。
后一个公式的推导显示在维基百科页面上,用于标准偏差 。
100万个数字(32位整数)需要大约4MB的内存,这是很小的。
只需将它们全部加载到int列表中,然后就可以使用内置的linq方法对它们进行操作。
更新:如何使用linq进行操作:
与Linq的数学统计