从Matlab中的范围计算值

从Matlab中的范围计算值,matlab,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 你能帮我把代码写得更快吗? 我觉得应该通过unique

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

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(数据、范围)


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

正如安德·比古里在评论中所说,
histcounts
是你想要的

该函数统计在两条边之间的每个箱子处发现的
X
Data
)值的数量,其中箱子定义如下:

值X(i)在第k个箱子中,如果边(k)≤ X(i)<边(k+1)

而最后一个箱子也包括右边缘

这意味着:

  • 对于N个值,需要N+1条边
  • 每个箱子应以您希望其包含的值开始(1:2之间,2:3之间,等等)
  • 在您的示例中:


    Counts=histcounts(数据,范围(1):(范围(结束)+1))

    我想指出此代码的一个问题:

    Counts = nan(numel(Range),1);
    for iRange = 1:numel(Range)
       Counts(iRange) = sum(Data==Range(iRange)); 
    end
    
    它显示一个循环,但是
    ==
    求和
    对数组中的所有元素都起作用,这使得这个与不这样做的循环相比非常昂贵,特别是当
    N
    很大时:

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

    hist
    或者更好的
    histcounts
    应该可以完成这项工作。你试过了吗?我知道他们应该做点什么,但我找不到方法。
    histcounts
    的第二个参数,如文档所述,是垃圾箱的边缘<代码>[0,1,2]
    将返回2个值:0-1和1-2之间数字的计数。只要正确定义你的范围。也许
    0:10^3