向@Floris +1 以获得使用hist. 它非常快。不过你可以做得更好一点。hist是基于 的histc,可以替代使用。histc是一个编译函数,即不是用Matlab编写的,这就是解决方案要快得多的原因。
这是一个小函数,它试图概括 @Floris 所做的事情(该解决方案也返回一个向量而不是所需的矩阵)并实现你正在做的事情nlfilterand 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您似乎所说的那样。