使用 accumarray 进行加权平均?
Using accumarray for a weighted average?
accumarray
在 Matlab 中非常棒,我经常使用它。我有一个问题,我想传递给 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 returns:
Error using accumarray
Second input VAL must be a vector with one element for each row in SUBS, or a scalar.
你是对的,第二个输入必须是列向量或标量。与其将 数据 传递给 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
accumarray
在 Matlab 中非常棒,我经常使用它。我有一个问题,我想传递给 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 returns:
Error using accumarray
Second input VAL must be a vector with one element for each row in SUBS, or a scalar.
你是对的,第二个输入必须是列向量或标量。与其将 数据 传递给 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