2017-01-13 3 views
1

accumarrayはすばらしく、私はそれを頻繁に使用します。 accumarrayに渡したい機能が加重平均であるという問題があります。すなわち、1つのベクトルではなく2つのベクトルを取り込む。これはaccumarrayでサポートされていない使用例です。加重平均にaccumarrayを使用していますか? Matlabの

私の理解は正しいですか?

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を返す:

は、我々は次のようにaccumarrayを実行したい、今、機能weightedAverage

function [ result ] = weightedMean(values, weights) 

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

end 

を考えてみましょうあなたは正しい

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

私は分かりません。私たちに例を挙げてもらえますか?多分あなたが試したコードですか? – beaker

答えて

1

を、第二入力はである必要があります列ベクトルまたはスカラー。 データaccumarrayに渡すのではなく、インデックス配列を渡して、加重平均を計算する無名関数内のvaluesweightsベクトルにインデックスを付けることができます。

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 
関連する問題