使用する優れた提案については、@Florisに+1してくださいhist
。とても速いです。ただし、もう少しうまくいくことができます。hist
に基づいておりhistc
、代わりに使用できます。histc
コンパイルされた関数です。つまり、Matlab で記述されていません。そのため、ソリューションははるかに高速です。
これは、@Florisが行ったことを一般化し(そのソリューションは、目的の行列ではなくベクトルを返します)、 and で行っていることを達成しようとする小さな関数nlfilter
ですcolfilt
。入力が特定の次元を持つ必要はなくim2col
、データを効率的に再配置するために使用されます。実際、最初の 3 行と への呼び出しは、あなたの場合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
、速度が 2 倍になります。a
もちろん、入力チェックは行われないため、関数はそれがすべて整数などであると想定します。
最後に、あなたが述べているようにではなくrandi(IMAX,N,N)
、範囲内の値を返すことに注意してください。1:IMAX
0:IMAX