2016-10-04 43 views
2

有沒有什麼辦法可以避免在下面的代碼中使用循環? 我正在做一個減少總和,即分組a和b的所有相同指數的值。替換爲這個MATLAB腳本中的循環

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

我正在做一個減少總和,即分組並將b中所有相同索引的值相加。 – Vimos

+0

您需要循環以減少求和。此外,該代碼似乎並沒有減少sumation .... –

回答

6

這正是*意味着什麼accumarray爲:

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

    0.60000 
    0.90000 
    0.60000 

* 其實,這是最簡單的件事accumarray一樣。它默認爲@sum,但您可以指定自己的函數來告訴它如何處理累計索引。

+0

如果問題的更一般版本沒有'a'的條目作爲'b'的純索引,你可能會也可以查看'findgroups'和'splitapply'(如果需要將多個變量分組,則這也更容易處理)。 – CKT

+0

@CKT謝謝!這些是我還沒有機會玩的新功能。我得看一看。 – beaker

2

這是一個非常昂貴避免環路的:

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

的總和在a的元件的增加的順序給出。此外,a未在b索引的情況下適用。

+0

nice'bsxfun'。 – GameOfThrows

+0

@GameOfThrows謝謝,我在這裏有很棒的'bsxfun'老師。 :-) – 2016-10-04 15:30:33

+1

:D讓我猜,Divakar? – GameOfThrows