Matlab快速邻居操作

use*_*536 5 matlab filter

我有个问题.我有一个矩阵A,其整数值介于0和5之间,例如:

x=randi(5,10,10)
Run Code Online (Sandbox Code Playgroud)

现在我想调用一个大小为3x3的过滤器,这给了我最常见的值

我试过2个解决方案:

fun = @(z) mode(z(:));
y1 = nlfilter(x,[3 3],fun);
Run Code Online (Sandbox Code Playgroud)

这需要很长时间......

y2 = colfilt(x,[3 3],'sliding',@mode);
Run Code Online (Sandbox Code Playgroud)

这也需要很长时间.我有一些非常大的矩阵,两种解决方案都需要很长时间.有没有更快的方法?

hor*_*ler 3

+1 给@Floris,以获得使用的极好建议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;
Run Code Online (Sandbox Code Playgroud)

用法:

x = randi(5,10,10);
y3 = intmodefilt(x,[3 3]);
Run Code Online (Sandbox Code Playgroud)

对于大型阵列,这比colfilt在我的机器上快 75 倍以上。替换histhistc可使速度提高两倍。当然没有输入检查,因此该函数假设a所有都是整数等。

最后,请注意randi(IMAX,N,N)返回 range 中的值1:IMAX,而不是0:IMAX您所说的那样。