使用accumarray加权平均值?

时间:2017-01-13 21:53:53

标签: matlab accumarray

Matlab中的

accumarray非常棒,我经常使用它。我有一个问题,我希望传递给accumarray的函数是加权平均值。即它采用两个向量,而不是单个向量。这似乎是accumarray不支持的用例。

我的理解是否正确?

考虑一下,函数weightedAverage

function [ result ] = weightedMean( values, weights)

result = sum(values(:).*weights(:)) / sum(weights(:));

end

现在,我们想按如下方式运行accumarray

subs    = [1 1 1 2 2 3 3 3];
vals    = [1 2 3 4 5 6 6 7];
weights = [3 2 1 9 1 9 9 9];

accumarray(subs, [vals;weights],[], @weightedMean)

但是matlab返回:

Error using accumarray
Second input VAL must be a vector with one element for each row in SUBS, or a scalar. 

1 个答案:

答案 0 :(得分:1)

你是对的,第二个输入必须是 列向量或标量。您可以传递一系列索引,然后可以使用这些索引从索引中导入accumarrayvalues向量,而不是将数据传递给weights。匿名函数,用于计算加权平均值。

inds = [1 1 2 2 3 3].';
values =  [1 2 3 4 5 6];
weights = [1 2 1 2 1 2];

output = accumarray(inds(:), (1:numel(inds)).', [], ...
                    @(x)sum(values(x) .* weights(x) ./ sum(weights(x))))
%    1.6667
%    3.6667
%    5.6667