在Win 7的Visual Studio中使用C#,我需要计算一大系列数字的均值和标准差。这些数字是从文件中读取的。 可能有十万甚至更多的数字。如果我不想将它们保存在数组或列表等数据结构中,因为这可能不是内存有效,如何有效地进行计算。
我还需要将数字打印到文件中。
答案在 How to calculate a standard deviation [array] 帮不了。
任何帮助将不胜感激!
最佳
答案 0 :(得分:5)
一万个数字什么都不是。几百万就足以让你考虑内存,但可能还不足以让你把它们全部留在内存中。
如果你达到数十亿,数万亿甚至更多,那么你就可能无法将它们拉入记忆中。看起来你似乎还没到那一点。
您可以将它们全部拉入List
,不需要担心。
话虽如此,LINQ的Average
方法实际上并不需要急切地加载所有数字来计算平均值;它只能使用“当前”项修改聚合值然后丢弃它,因此其内存占用非常低。您在问题中链接到的所有StdDev方法都可以这样说;它们都有一个小的常量内存占用。
所以你需要做的就是创建一个IEnumerable<double>
来代表你文件中一个延迟填充的数字序列,你可以在它上面调用这些方法。没有必要急切地将它们加载到内存中。
答案 1 :(得分:4)
计算一次处理一个数字时的平均值和标准差:
将Count
,Sum
和SumOfSquares
初始化为零。
收到每个号码后,在Count
添加一个号码,将号码添加到Sum
,然后将号码的平方加到SumOfSquares
。
处理完每个号码后,请将Mean
设置为Sum / Count
,然后将StandardDeviation
设置为Math.Sqrt(SumOfSquares / Count - Mean * Mean)
。
后一个公式的推导显示在the Wikipedia page for standard deviation。
中答案 2 :(得分:-1)
100万个数字(32位整数)需要大约4mb的内存,这很小。
只需将它们全部加载到int的列表中,然后就可以使用内置的linq方法对它们进行操作。
更新: 如何使用linq进行操作: