在Matlab中计算范围内的值

时间:2018-07-24 08:40:38

标签: matlab

我想计算数组中值的数量。我有一个有效的代码:

Range = [1:10^3];% [1:10^6];
N = 10^2;% 10^8

Data = randi([Range(1),Range(end)],N,1);

Counts = nan(numel(Range),1);

for iRange = 1:numel(Range)
   Counts(iRange) = sum(Data==Range(iRange)); 
end

您能帮我加快这段代码的速度吗?

我认为应该通过uniquehist,但找不到解决方案。

N = histcounts(Data,Range)

给我999个数字,而不是1000个。

2 个答案:

答案 0 :(得分:1)

Ander Biguri在评论中指出,histcounts是您追求的目标。

该函数计算X(在您的示例中为Data)的值数,该值在两条边之间的每个bin处找到,其中bin定义为:

  

如果edge(k)≤X(i)

最后一个垃圾箱还包括右边缘。

这意味着:

  1. 对于N个值,您需要N + 1条边。
  2. 每个bin都应从您要包含的值开始(1在1:2之间,2在2:3之间,依此类推)。

在您的示例中:

Counts = histcounts(Data,Range(1):(Range(end)+1))';

答案 1 :(得分:0)

我想指出此代码的问题:

Counts = nan(numel(Range),1);
for iRange = 1:numel(Range)
   Counts(iRange) = sum(Data==Range(iRange)); 
end

它显示了一个循环,但是==sum处理数组中的所有元素,与没有这样做的循环相比,这确实昂贵,尤其是在N大的情况下:

Counts = zeros(numel(Range),1);
for elem = Data(:).'
   Counts(elem) = Counts(elem) + 1;
end