2017-01-13 5 views
1

accumarray dans Matlab est incroyable, et je l'utilise souvent. J'ai un problème où la fonction que je voudrais passer à accumarray est une moyenne pondérée. c'est-à-dire qu'il prend deux vecteurs, pas un seul vecteur. Cela semble être un cas d'utilisation non pris en charge par accumarray.Utiliser accumarray pour une moyenne pondérée?

Est-ce que je comprends bien?

Tenir compte, la fonction weightedAverage

function [ result ] = weightedMean(values, weights) 

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

end 

Maintenant, nous voulons exécuter accumarray comme suit:

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) 

mais revient Matlab:

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

Je ne sais pas. Pouvez-vous nous donner un exemple? Peut-être que le code que vous avez essayé? – beaker

Répondre

1

Vous avez raison, la deuxième l'entrée doit être soit un vecteur colonne ou un scalaire. Plutôt que de passer vos données à accumarray, vous pouvez passer un tableau d'indices que vous pouvez ensuite utiliser pour indexer dans vos values et weights vecteurs à partir de la fonction anonyme qui calcule votre moyenne pondérée.

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