向数组的间隔添加不同的数量。 Avoding循环?

时间:2011-07-06 18:51:55

标签: matlab

说我有一系列值:

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 个答案:

答案 0 :(得分:1)

编辑:

实际上,这是一种更加智能和矢量化的方式:

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)];