我试图找出最佳的方式执行计算的快速和想要找出什么样的办法,人们通常将在这样的情况。

我有一个名单的对象具有的性质,我想要计算的平均和标准偏差.我以为使用 数学。净库可能会更容易/进行了优化业绩。

不幸的是,输入参数,这些职能的阵列。是我唯一的解决办法写我自己的功能计算装置和性传播疾病?我可以写一些种扩展的方法列出了使用氧功能喜欢 在这里,?或者我最好的书写职能返回阵列是我的对象的性质和使用这些用Math.NET.

据推测的回答取决于一些东西,如大小的名单?让我们说为了讨论的缘故,名单有50个要素。我担心的是纯粹的性能。

有帮助吗?

解决方案

ArrayStatistics 确实希望阵列,因为它是优化了这种特殊情况(这就是为什么它被称为ArrayStatistics).同样地, StreamingStatistics 是的优化用于综合的顺序流,如果没有保持数据存储器中。一般类别,适用于所有类型的输入是的 Statistics 类。

你有没有证实,只需使用皇宫和StreamingStatistics是不是足够快的在你的使用情况?计算这些统计数字的列表,仅仅是50项是几乎没有可衡量的在所有,除非另有说你做一万次,在一个循环。

例Math.NET 数字v3。0.0-alpha7,使用组在列表中以仿效你的定义类型:

using MathNet.Numerics.Statistics;

var data = new List<Tuple<string, double>>
{
    Tuple.Create("A", 1.0),
    Tuple.Create("B", 2.0),
    Tuple.Create("C", 1.5)
};

// using the normal extension methods within `Statistics`
var stdDev1 = data.Select(x => x.Item2).StandardDeviation();
var mean1 = data.Select(x => x.Item2).Mean();

// single pass variant (unfortunately there's no single pass MeanStdDev yet):
var meanVar2 = data.Select(x => x.Item2).MeanVariance();
var mean2 = meanVar2.Item1;
var stdDev2 = Math.Sqrt(meanVar2.Item2);

// directly using the `StreamingStatistics` class:
StreamingStatistics.MeanVariance(data.Select(x => x.Item2));

其他提示

该eaisiest解决方案可使用的是把 皇宫 因此,改变 List阵列

  List<SomeClass> list = ...

  GetMeanAndStdError(list.ToArray()); // <- Not that good performance

然而,如果perforamance是你的关心,你宁愿的意思是计算和差异的明确(编写自己的功能):

  List<SomeClass> list = ...

  Double sumX = 0.0;
  Double sumXX = 0.0;

  foreach (var item in list) {
    Double x = item.SomeProperty;

    sumX += x;
    sumXX += x * x;
  }

  Double mean = sumX / list.Count;
  Double variance = (sumXX / list.Count - mean);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top