2016-10-04 2 views
2

次のコードでループを使用しないようにする方法はありますか? 私はaをグループ化して、同じインデックスのすべての値をbから合計する減算を行っています。このMATLABスクリプトでループを置換する

rsum = b*(bsxfun(@eq,a.',unique(a))); 

和がaの要素の昇順で与えられる:

a = [ 1 3 2 3 1 2] 
b = [0.1 0.2 0.3 0.4 0.5 0.6] 
for i = unique(a) 
    c(i) = sum(b(ismember(a, i))) 
end 
+1

あなたは何をすることを説明できますか? –

+0

私はaをグループ化し、同じインデックスのすべての値をbから合計する減算を行っています。 – Vimos

+0

あなたは減算のためにループする必要があります。また、そのコードは減算を行っているようではありません.... –

答えて

6

これがためのものです正確に*何accumarrayです:*

>> accumarray(a.',b.') 
ans = 

    0.60000 
    0.90000 
    0.60000 

実は、これはaccumarrayがないこと最も簡単なものです。デフォルトでは@sumになりますが、独自の関数を指定して、累積インデックスを使って何をするかを指定することができます。

+0

問題のより一般的なバージョンでは、 'a'のエントリが' b'の純粋なインデックスでない場合、 'findgroups'と' splitapply'も調べます(複数の変数をグループ化する必要がある場合は対処が簡単です)。 – CKT

+0

@CKTありがとう!これらは私がまだ遊ぶ機会がなかった新しい機能です。私は一見する必要があります。 – beaker

2

これは、ループの非常に高価回避です。また、aのインデックスがbでない場合の動作

+0

nice' bsxfun'を使ってください。 – GameOfThrows

+0

@GameOfThrowsありがとう、私は素晴らしい 'bsxfun'先生がいたので、 :-) –

+1

:D私はDivakarを推測させてください? – GameOfThrows

関連する問題