向@Floris +1 以获得使用hist
. 它非常快。不过你可以做得更好一点。hist
是基于 的histc
,可以替代使用。histc
是一个编译函数,即不是用Matlab编写的,这就是解决方案要快得多的原因。
这是一个小函数,它试图概括 @Floris 所做的事情(该解决方案也返回一个向量而不是所需的矩阵)并实现你正在做的事情nlfilter
and colfilt
。它不要求输入具有特定的维度并用于im2col
有效地重新排列数据。实际上,前三行和对的调用im2col
实际上与colfit
您的情况相同。
function a=intmodefilt(a,nhood)
[ma,na] = size(a);
aa(ma+nhood(1)-1,na+nhood(2)-1) = 0;
aa(floor((nhood(1)-1)/2)+(1:ma),floor((nhood(2)-1)/2)+(1:na)) = a;
[~,a(:)] = max(histc(im2col(aa,nhood,'sliding'),min(a(:))-1:max(a(:))));
a = a-1;
用法:
x = randi(5,10,10);
y3 = intmodefilt(x,[3 3]);
对于大型阵列,这比colfilt
我的机器上快 75 倍以上。替换hist
为histc
负责两倍加速的因素。当然没有输入检查,因此该函数假定a
所有整数等。
最后,请注意randi(IMAX,N,N)
返回 range 中的值1:IMAX
,而不是0:IMAX
您似乎所说的那样。