在一行中多次递增MATLAB数组的一个值

问题描述:

这是一个关于在同一语句中多次递增MATLAB数组的一个值而不必使用for循环的问题。在一行中多次递增MATLAB数组的一个值

设置我的数组:

>> A = [10 20 30]; 

然后运行:

>> A([1, 1]) = A([1, 1]) + [20 3] 

A = 

    13 20 30 

显然,20被忽略。但是,我想它列入,使:

>> A = [10 20 30]; 
>> A([1, 1]) = A([1, 1]) + [20, 3] 

会给:

A = 

    33 20 30 

是否有一个功能允许这种在一个不错的,矢量化的方式进行?

(在现实中,所述分度到该阵列将包括多个索引,所以它可能是[1 1 2 2 1 1 1 1 3 3 3]等,用数字的阵列,以通过(所述[20, 3]上述相同的长度的增加)。)

你想做的事可以用函数ACCUMARRAY来完成,像这样什么:

A = [10 20 30];   %# Starting array 
index = [1 2 2 1];   %# Indices for increments 
increment = [20 10 10 3]; %# Value of increments 
A = accumarray([1:numel(A) index].',[A increment]); %'# Accumulate starting 
                 %# values and increments 

而本实施例的输出应为:

A = [33 40 30]; 


编辑:如果A是一个大阵的值,并有短短的增量增加,下面可能比上述计算效率更高:

B = accumarray(index.',increment); %'# Accumulate the increments 
nzIndex = (B ~= 0);    %# Find the indices of the non-zero increments 
A(nzIndex) = A(nzIndex)+B(nzIndex); %# Add the non-zero increments 
+0

aaargh,快30秒:) – Adrien 2010-10-17 20:41:36

+1

谢谢,我有第一个工作的一种享受。我相信在SUBS上没有转置符号 - 我只能做'A = accumarray([1:numel(A)索引]',[增量]);'工作。一旦我的数据被填充,我会为第二个建议做一些速度比较。 – 2010-10-18 09:14:55

+0

@ Bill:你说得对。在这种情况下,我忘了第一个输入必须是列向量。通常,第一个输入必须是一个M乘N矩阵,其中M是要累加的值的数量,N是下标的数量(在这种情况下为1,但对于多维索引而言更多)。 – gnovice 2010-10-18 14:03:19

也许有一些我不太明白的地方,但你基本上试图在A的第一个元素上添加23,对吧?所以,你可以写:

A([1, 1]) = A([1, 1]) + sum([20 3]) 

此外,如果你有一个索引数组,你可以写

indexArray = [1 2 2 3 1 1 2 1]; 
toAdd = [20 3]; 
A = [10 20 30]; 

A(indexArray) + sum(toAdd) 

ans = 
33 43 43 53 33 33 43 33 
+0

这并不解决他一般问题。 – 2010-10-17 20:26:48

+0

@Oli Charlesworth:不确定它现在是否有效,但是在编写评论时我已经编辑了这个问题。 – Jonas 2010-10-17 20:44:23

+1

我认为一般情况下'toAdd'的长度与'indexArray'的长度相同。所以如果'indexArray'的内容是唯一的,那么你只需要'A(indexArray)+ toAdd'。 – 2010-10-17 20:46:58