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)