0

我重新提出了我本周提出的一个问题,由于缺少标签,没有引起注意(基本上只有我自己查看过)。

我有两个大向量,值和索引。我需要像在这个蛮力示例中那样使用索引对值的元素求和:

% 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)

问题是:由于这确实是一个基本功能,是否有任何更快、已知的方法/功能可以做同样的事情并且我可能会忽略或我只是不知道?

4

1 回答 1

0

如果生成索引不仅仅是其他人的虚拟对象,则可以改进。目前,您正在浪费 3/4 的生成数字。1) 确定您想要的索引数量(二项分布) 2) 仅生成使用的索引。

于 2013-10-26T12:05:41.760 回答