2

これは、forループを使用せずに、同じステートメントでMATLAB配列の1つの値を複数回インクリメントすることに関する質問です。

配列を次のように設定します。

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

たぶん私がここで完全に理解していないことがあるかもしれませんが、あなたは基本的に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
于 2010-10-17T20:24:53.557 に答える