从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)
而最后一个箱子也包括右边缘
这意味着:
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
?