为什么统计的速度变化如此之大?

7次浏览(过去30天)
1月
1月 2021年8月22日
评论道: 1月 2021年8月22日
我有一个整数或浮点值的向量,并想计算出现的次数。
histcounts () 使用输入Edge的激光元素作为最后一个bin的上限,所以我必须添加一个比最大元素更大的数字才能正确计数。当值是整数时,这会使处理速度降低> 2:
%整数值:
X = round((1:1e6) / 1);%也等同于“/ 10”
X = X (randperm(numel(X)));
Ux =唯一的(x);
ux2 = [ux, Inf];
Ux3 = [ux, 1e8];%任何巨大的数字
Ux4 = [ux, ux(end) + 1];
timeit(@() histcounts(x, ux))% 0.045
timeit(@() histcounts(x, ux2))慢多了!!
timeit(@() histcounts(x, ux3))% 0.199 %比Inf?
timeit(@() histcounts(x, ux4))又快了
% BinMethod=Integers是快速的,但箱子的数量是有限的:
时间(@ ()histcounts (x,“BinMethod”“整数”))快!
元素个数(histcounts (x,“BinMethod”“整数”))但是只有10001而不是1e6
根据文档,这应该是65536 ?!?
%浮点值:
Y = rand(1,1e6);
Uy =唯一的(y);
uy2 = [uy, Inf];
Uy3 = [uy, uy(end) + 1];
timeit(@() histcounts(y, uy))% 0.11148
timeit(@() histcounts(y, uy2))% 0.2066
timeit(@() histcounts(y, uy3))% 0.2100
% Local R2018b:类似的行为用于整数,浮点值处理更快:
% 0.073 %整数,ux
% 0.199 % [ux, Inf]
% 0.189% [ux, 1e8]
% 0.061 % [ux, ux(end + 1)]
% 0.162%浮点数,uy
% 0.167% [uy, Inf]
% 0.315 % [uy, uy(结束)+ 1]%半速!!
我期望几乎相同的速度,因为工作量几乎相同。
顺便说一下,一个简单的计数函数也很快:
时间(@ ()simpleCount (x))% 0.0602
时间(@ ()simpleCount (y))% 0.0628
函数N = simpleccount (x)
S = sort(x);
q = [true, diff(S) ~= 0];
N = diff([查找(q),数字(x) + 1]);
结束
histcounts () 将最后一个元素计算到前一个箱子中是没有用的,但是附加最后一个边会大大减慢处理速度。我已经向TWM发送了增强请求。
5个评论
1月
1月 2021年8月22日
@Adam Danz 谢谢你提供这么有用的信息。

登录评论。

答案(1)

布鲁诺陈德良
布鲁诺陈德良 2021年8月22日
这只是一个假设,但histcounts可能对有限边值使用二分搜索。大的最后边缘可能惩罚速度。不确定如何处理Inf与bonary搜索(可能是一个额外的比较检查?)
2的评论
布鲁诺陈德良
布鲁诺陈德良 2021年8月22日
BinMethod 'Integers'在可以保证2^16个箱子足够的情况下是有用的
把你的手拿过来用 accumarray 代替。

登录评论。

类别

了解更多线情节帮助中心而且文件交换

s manbetx 845


释放

R2021a

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!