代码之家  ›  专栏  ›  技术社区  ›  zlon

在Matlab中从范围计算值

  •  1
  • zlon  · 技术社区  · 8 年前

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

    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个。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Prostagma user6136315    8 年前

    作为 Ander Biguri 在评论中说, histcounts 就是你所追求的。

    函数计算 X ( Data 在您的示例中,可以在两条边之间的每个箱中找到,其中箱定义如下:

    如果边(k)–X(i)<边(k+1),则值X(i)在第k个bin中。

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

    这意味着:

    1. 对于N个值,需要N+1条边。
    2. 每个bin应该以您希望它包含的值开始(1在1:2之间,2在2:3之间,等等)。

    在您的示例中:

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

        2
  •  0
  •   Cris Luengo    8 年前

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

    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