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

时间:2010-10-17 20:22:22

标签: arrays matlab increment vectorization

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

2 个答案:

答案 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