2010-06-23 115 views
1

使用Boost的累加器,我可以轻松计算出 加权或未加权输入集的统计量。我想知道是否可以在同一个累加器内混合加权 和未加权的数量。看看 docs它似乎并不是这样。使用相同的boost :: accumulator_set计算加权和未加权统计量?

编译没有问题,但产生的另一个结果不是我所希望的:

using namespace boost::accumulators; 

const double a[] = {1, 1, 1, 1, 1, 2, 2, 2, 2}; 
const double w[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 

accumulator_set<double, features<tag::sum, tag::weighted_sum>, double> stats; 
for (size_t i=0; i<9; ++i) 
    stats(a[i], weight = w[i]); 

std::cout << sum(stats) <<" "<< weighted_sum(stats) << std::endl; 
// outputs "75 75" instead of "13 75" 

而且,与第三模板参数accumulator_set我似乎总是 获得加权量,用“加权”功能,即使和提取:

accumulator_set<double, features<tag::sum>, double> stats; 
for (size_t i=0; i<9; ++i) 
    stats(a[i], weight = w[i]); 
std::cout << sum(stats) << std::endl; 
// outputs "75" instead of 13 

我每次必须使用两个不同的蓄电池,如果我想计算两个 加权和不加权量?

编辑 我只是用sum作为一个例子,在现实中我感兴趣的多,更复杂的数量。

回答

0

它在说documentation

当您指定的权重,所有的 蓄电池组中的被替换 与它们的加权当量。

可能有更好的方法来做到这一点,但你可以尝试这样的事情(基本上是交换价值的意义与重量):

accumulator_set< double, stats< tag::sum, tag::sum_of_weights >, double > acc; 
const double a[] = {1, 1, 1, 1, 1, 2, 2, 2, 2}; 
const double w[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 

    for(int i = 0; i < sizeof(a)/sizeof(a[ 0 ]); i++) 
     acc(w[ i ], weight = a[ i ]); 

    std::cout << extract_result<tag::sum>(acc) << std::endl; // weighted sum, prints 75 
    std::cout << extract_result<tag::sum_of_weights>(acc) << std::endl; // sum, prints 13 
+0

谢谢!是的,这对'sum'的情况是有效的。我没有说清楚这仅仅是一个例子,当我真正有兴趣提取其他更复杂的数量时(例如方差,中值和均值以及它们的加权对应数)。总而言之,一开始可能不会使用累加器。 – 2010-06-23 06:02:07

+0

我接受这个答案,因为它指出了文档中的明显的一点。我仍然不知道是否有一些令人讨厌的模板技巧来做我想做的事情,但从文档看来,这似乎需要一个肮脏的黑客,而不是'accumulator_set'直接支持的东西。 – 2010-06-24 00:28:48