【问题标题】:Incrementing one value of a MATLAB array multiple times in one line在一行中多次递增 MATLAB 数组的一个值
【发布时间】:2010-10-17 20:22:22
【问题描述】:

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

【问题讨论】:

    标签: arrays matlab increment vectorization


    【解决方案1】:

    你想要做的可以使用函数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
    

    【讨论】:

    • 谢谢,我已经得到第一个工作的款待。我相信 SUBS 上缺少转置符号 - 我只能让 A = accumarray([1:numel(A) index]',[A increment]); 工作。填充数据后,我将对第二个建议进行一些速度比较。
    • @Bill:你是对的。我忘记了在这种情况下,第一个输入必须是列向量。通常,第一个输入必须是 M×N 矩阵,其中 M 是累积值的数量,N 是下标的数量(在这种情况下为 1,但对于多维索引更多)。
    • @Adrien:不要惊讶。 @gnovice 是唯一拥有金色 Matlab 徽章的用户。这意味着他既快速又正确。
    • @Jonas:……或者彻底沉迷于 SO。 ;)
    【解决方案2】:

    也许有些东西我不太明白,但您基本上是在尝试将 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
    

    【讨论】:

    • @Oli Charlesworth:不确定现在是否有,但我在你写评论的时候已经编辑了这个问题。
    • 我认为一般情况下toAdd的长度与indexArray的长度相同。因此,如果indexArray 的内容是唯一的,您只需使用A(indexArray) + toAdd
    • @Oli Charlesworth:啊,好的。是的,这也是有道理的。当很明显这是 OP 想要的,而不是 @gnovice 的建议时,我会用你的评论更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2023-03-04
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多