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.
答案 0 :(得分:1)
你是对的,第二个输入必须是 列向量或标量。您可以传递一系列索引,然后可以使用这些索引从索引中导入accumarray
和values
向量,而不是将数据传递给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