Добавление разного количества в интервалы массива. Аводинг зацикливания? - PullRequest
3 голосов
/ 06 июля 2011

Скажем, у меня есть массив значений:

values = 1:100;

массив индексов:

interval_indices = [40 45 80];

и массив величин, которые я хотел бы добавить к элементам в values:

quantities_to_add = [5 -9 30];

Я ищу компактное выражение в MATLAB (возможно, использующее accumarray?), Которое позволяет мне добавлять значения quantities_to_add к элементам в values в зависимости отиндексы, указанные как indices.

Если бы я делал это вручную:

values(1:interval_indices(1))                         = values(1:interval_indices(1)) + ...
                                                         quantities_to_add(1);
values(interval_indices(1):interval_indices(2))       = values(interval_indices(1):interval_indices(2)) + ... 
                                                         quantities_to_add(2);
% and so forth

values(interval_indices(end-1):interval_indices(end)) = values(interval_indices(end-1):interval_indices(end)) + ...
                                                         quantities_to_add(end);

1 Ответ

1 голос
/ 06 июля 2011

РЕДАКТИРОВАТЬ:

На самом деле, это гораздо умнее и векторизованный способ сделать то же самое:

lastIndx=interval_indices(end);   
quantitiesVector=zeros(1,lastIndx);
quantitiesVector([1,interval_indices(1:end-1)+1])=[quantities_to_add(1) diff(quantities_to_add)];

newValues=[values(1:lastIndx)+cumsum(quantitiesVector),values(lastIndx+1:end)];

Предыдущий ответ:

Один из способовдля этого используется arrayfun для генерации вектора величин, а затем добавление.

intervalLength=diff([0 indices]);
lastIndx=interval_indices(end);
quantities=cell2mat(arrayfun(@(x)ones(1,intervalLength(x))*quantities_to_add(x),1:numel(indices),...
    'UniformOutput',false));

newValues=[values(1:lastIndx)+quantities, values(lastIndx+1:end)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...