2

这是一个关于在同一语句中多次递增 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]上述)相同的长度递增。)

4

2 回答 2

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
于 2010-10-17T20:36:21.453 回答
1

也许有些东西我不太明白,但是您基本上是在尝试将 23 添加到 A 的第一个元素,对吗?所以你可以写:

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-17T20:24:53.557 回答