我想计算数组中值的数量。我有一个有效的代码:
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
您能帮我加快这段代码的速度吗?
我认为应该通过unique
或hist
,但找不到解决方案。
N = histcounts(Data,Range)
给我999个数字,而不是1000个。
答案 0 :(得分:1)
Ander Biguri
在评论中指出,histcounts
是您追求的目标。
该函数计算X
(在您的示例中为Data
)的值数,该值在两条边之间的每个bin处找到,其中bin定义为:
如果edge(k)≤X(i)
最后一个垃圾箱还包括右边缘。
这意味着:
在您的示例中:
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