提前感谢您的帮助
我使用以下内容来计算向量v
中值x的出现次数count = sum(v == x);
无论如何我可以减少计算这些事件的时间吗?请注意,v往往很小;通常不超过100个元素。但是,这个操作在我的代码中发生了数万次,并且在使用分析器分析我的代码时似乎是最耗时的操作。我已经看过了accumarray函数,但看起来上面给出的方法往往更快(至少我尝试使用它的方式)。
答案 0 :(得分:1)
根据代码的其余部分和数据类型,一种可能的方法是从x
中减去v
并改为计数零。如,
v = rand(200,1);
v(121) = v(3); % add some duplicates of v(3)
v(189) = v(3); % add some duplicates of v(3)
x = v(3);
count = numlel(v)-nnz(v-x);
减去CPU时间的成本,但最终可能会从中受益。由于我没有您的数据,我只做了一个小测试。您可以测试您的实际数据,看看它是否适合您。
N = 100000;
for k = 1:1
v = randn(200,1);
vy = zeros(size(v));
v(121) = v(3);
v(189) = v(3);
x = v(3);
t1=tic;
for j = 1:N
count1 = sum(v(:)==x);
end
t1s=toc(t1)/N;
t2=tic;
for j = 1:N % time the cost of subtraction prior to nnz()
vy=v-x;
count2 = numel(v)-nnz(vy);
end
t2s=toc(t2)/N;
t3=tic;
for j = 1:N % time the cost of subtraction within nnz()
count3 = numel(v)-nnz(v-x);
end
t3s=toc(t3)/N;
[count1 count2 count3]
[t1s t2s t3s]
end
ans =
3 3 3
ans =
1.0e-05 *
0.1496 0.1048 0.1222
你可以看到John D' Errico关于计算零的答案here。