说我有一系列值:
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}}
答案 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)];