4

行列内の特定の要素を囲む要素の合計を計算したい。これまでのところ、次のコード行を記述しました。

for i=1:m,
        rij(1:n)=0
        for j=1:n,
            alive = tijdelijk(i-1,j)+tijdelijk(i+1,j)+tijdelijk(i-1,j-1)+tijdelijk(i+1,j-1)+tijdelijk(i,j+1)+tijdelijk(i,j-1)+tijdelijk(i-1,j+1)+tijdelijk(i+1,j+1)

これは、たとえば、i=1 の場合、i-1 がゼロになるため、エラーになります。このエラーを発生させずにこれを行う方法を知っている人はいますか?

4

3 に答える 3

13

フィルタリングを介して要素を合計できます。conv2この方法で使用できます。

例を挙げましょう。サンプル マトリックスを作成します

>> A = reshape(1:20, 4, 5)

A =

 1     5     9    13    17
 2     6    10    14    18
 3     7    11    15    19
 4     8    12    16    20

次に、フィルターを作成します。フィルターは、現在のセルに中心を置くマスクのようなもので1's、フィルターの に対応する位置が合計されます。8 つの接続されたネイバーの場合、フィルタは次のようになります。

>> B = [1 1 1; 1 0 1; 1 1 1]

B =

 1     1     1
 1     0     1
 1     1     1

次に、この小さな行列で行列をたたみ込むだけです。

>> conv2(A, B, 'same')

ans =

13    28    48    68    45
22    48    80   112    78
27    56    88   120    83
18    37    57    77    50

If you want four-connected neighbours, you can make the corners of your filter 0. 同様に、すべての近隣を合計する代わりに平均化するなど、目的に合わせて任意のフィルターを設計できます。

詳細については、Wikipediaの畳み込みの記事を参照してください。

于 2013-03-12T10:14:38.097 に答える
1

2つの可能性:ループの制限をに変更するか、 blkproci=k:(m-k)j=k:(n-k)使用します

元 :

各8行8列のブロックの2次元DCTを計算します

I = imread('cameraman.tif');
fun = @dct2;
J = blkproc(I,[8 8],fun);
imagesc(J), colormap(hot)
于 2013-03-12T10:20:20.317 に答える
0

エッジでできることはたくさんあります。どちらを行うかは、問題に非常に具体的に依存し、使用ケースごとに異なります。よくあること:

  1. (i-1) または (i+1) が範囲外の場合は、その要素を無視します。これは、行列の外側をゼロでパディングし、それに応じてループ制限を調整することと同じです。
  2. 縁を包みます。言い換えると、MxN 行列の場合、(i-1) で 0 になる場合、要素 (i-1, j) = (0, j) を取得する代わりに、要素 (M, j) を取得します。

あなたのコードは「あなたの先生」に言及しているので、エッジで何が起こるべきかを尋ねることができると思います(または、賢明な方法でそれを解決することがタスクの一部になる可能性があります!!)。

于 2013-03-12T15:56:07.303 に答える