2016-10-04 42 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