Matlab:有没有更快的方法来计算向量中值的出现次数?

时间:2016-04-20 06:07:39

标签: matlab

提前感谢您的帮助

我使用以下内容来计算向量v

中值x的出现次数
count = sum(v == x);

无论如何我可以减少计算这些事件的时间吗?请注意,v往往很小;通常不超过100个元素。但是,这个操作在我的代码中发生了数万次,并且在使用分析器分析我的代码时似乎是最耗时的操作。我已经看过了accumarray函数,但看起来上面给出的方法往往更快(至少我尝试使用它的方式)。

1 个答案:

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