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

Bil*_*ham 2 arrays matlab increment vectorization

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

我将我的数组设置为:

>> A = [10 20 30];
Run Code Online (Sandbox Code Playgroud)

然后运行:

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

A =

    13    20    30
Run Code Online (Sandbox Code Playgroud)

显然,20被忽略了.但是,我希望它被包括在内,以便:

>> A = [10 20 30];
>> A([1, 1]) = A([1, 1]) + [20, 3]
Run Code Online (Sandbox Code Playgroud)

会给:

A =

    33    20    30
Run Code Online (Sandbox Code Playgroud)

是否有一个函数允许以一种漂亮的矢量化方式完成它?

(实际上,对数组的索引将包括多个索引,因此它可能是[1 1 2 2 1 1 1 1 3 3 3]等等,并且数字数组将以[20, 3]相同的长度递增(以上).)

gno*_*ice 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
Run Code Online (Sandbox Code Playgroud)

这个例子的输出应该是:

A = [33 40 30];
Run Code Online (Sandbox Code Playgroud)


编辑:如果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
Run Code Online (Sandbox Code Playgroud)