我重新提出了我本周提出的一个问题,由于缺少标签,没有引起注意(基本上只有我自己查看过)。
我有两个大向量,值和索引。我需要像在这个蛮力示例中那样使用索引对值的元素求和:
% The two vectors, which are given, look like this:
N = 3e7;
values = (rand(N, 1) > 0.3);
indices = cumsum(ceil(4*rand(N, 1)));
indices = [0; indices(find(indices > 1, 1, 'first'):find(indices < N, 1, 'last')); N];
HH = numel(indices) - 1;
% This is the brute force solution
tic
out1 = zeros(HH, 1);
for hh = 1:HH
out1(hh) = sum(values((indices(hh)+1):indices(hh+1)));
end
toc
一种更有效的方法如下:
tic
indices2 = diff(indices);
new_inds = (1:HH+1)';
tmp = zeros(N, 1);
tmp(cumsum(indices2)-indices2+1)=1;
new_inds_long = new_inds(cumsum(tmp));
out2 = accumarray(new_inds_long, values);
toc
更好的解决方案是:
tic
out3 = cumsum(values);
out3 = out3(indices(2:end));
out3 = [out3(1); diff(out3)];
toc
三种解决方案是等价的
all(out1 == out2)
all(out1 == out3)
问题是:由于这确实是一个基本功能,是否有任何更快、已知的方法/功能可以做同样的事情并且我可能会忽略或我只是不知道?