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

Matlab:有没有更快的方法来计算向量中某个值的出现次数?,matlab,Matlab,提前谢谢你的帮助 我使用以下公式来计算向量v中值x的出现次数 count = sum(v == x); 我是否可以减少计算这些事件的时间?注意,v趋于小;通常不超过100个元素。然而,这个操作在我的代码中发生了数万次,并且在使用探查器分析我的代码时似乎是迄今为止最耗时的操作。我已经看过accumarray函数,但我上面给出的方法似乎更快(至少是我尝试使用它的方式)。根据代码的其余部分和数据类型,一种可能的方法是从v中减去x,然后改为计算零。例如: v = rand(200,1); v(121)

提前谢谢你的帮助

我使用以下公式来计算向量v中值x的出现次数

count = sum(v == x);

我是否可以减少计算这些事件的时间?注意,v趋于小;通常不超过100个元素。然而,这个操作在我的代码中发生了数万次,并且在使用探查器分析我的代码时似乎是迄今为止最耗时的操作。我已经看过accumarray函数,但我上面给出的方法似乎更快(至少是我尝试使用它的方式)。

根据代码的其余部分和数据类型,一种可能的方法是从
v
中减去
x
,然后改为计算零。例如:

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关于数零的回答。

您是否可以再多写一点关于如何数千次调用此片段的内容?
v
总是一样的吗?
x
有很大的不同吗?你能同时做多个这样的比较吗?v和x每次都不同。此外,一次只进行一次比较。我试图建立一个迭代的局部搜索启发式算法,其中计数是目标函数输出的一部分。这就是为什么它被称为如此频繁,你应该给我们更多的信息。耗时的部分不是这个操作本身的总和(v==x),而是需要调用它数千次(我猜是许多循环)。尽量使用尽可能少的循环会使代码更快。如果你的维度不受限制,你能考虑把所有的<代码> V< /代码>和所有<代码> x <代码>连接到一个矩阵,然后只执行一次代码> v==x <代码>吗?显然,然后你必须按行或列求和,这取决于你是否按行或列连接所有的
v
x
。根据我用这种方法与我正在使用的方法进行的测试,我正在使用的方法大约快1.2%。那么减法在你的情况下成本太高了,我想。既然是这样,我支持uPhone的建议;“问题”不在于代码的这一部分。是否可以选择将这些调用中的一些移植到例如mex代码?我无法移植它(请参阅我上面关于本地迭代搜索的评论),我想我只能处理它。谢谢你的建议!我对你的答案投了赞成票。我只是想移植搜索,而不是完整的代码。例如,像下面这样简单的东西,只需调用函数作为
count=foo(v(:),x)。不确定你是否能获得很多,但值得一试。