这是一个关于在同一语句中多次递增一个MATLAB数组值的问题,而不必使用for循环。
我将我的数组设置为:
>> 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]
以上) 。)
答案 0 :(得分:11)
您可以使用函数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
答案 1 :(得分:1)
也许有一些我不太满意的东西,但你基本上是想在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