在一行中多次递增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
也许有一些我不太明白的地方,但你基本上试图在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
这并不解决他一般问题。 – 2010-10-17 20:26:48
@Oli Charlesworth:不确定它现在是否有效,但是在编写评论时我已经编辑了这个问题。 – Jonas 2010-10-17 20:44:23
我认为一般情况下'toAdd'的长度与'indexArray'的长度相同。所以如果'indexArray'的内容是唯一的,那么你只需要'A(indexArray)+ toAdd'。 – 2010-10-17 20:46:58
aaargh,快30秒:) – Adrien 2010-10-17 20:41:36
谢谢,我有第一个工作的一种享受。我相信在SUBS上没有转置符号 - 我只能做'A = accumarray([1:numel(A)索引]',[增量]);'工作。一旦我的数据被填充,我会为第二个建议做一些速度比较。 – 2010-10-18 09:14:55
@ Bill:你说得对。在这种情况下,我忘了第一个输入必须是列向量。通常,第一个输入必须是一个M乘N矩阵,其中M是要累加的值的数量,N是下标的数量(在这种情况下为1,但对于多维索引而言更多)。 – gnovice 2010-10-18 14:03:19