Увеличение одного значения массива MATLAB несколько раз в одной строке - PullRequest
2 голосов
/ 18 октября 2010

Это вопрос об увеличении одного значения массива 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 ]

11 голосов
/ 18 октября 2010

То, что вы хотите сделать, можно сделать с помощью функции 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 голос
/ 18 октября 2010

Может быть, есть кое-что, чего я не совсем понимаю, но вы в основном пытаетесь добавить 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
...