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相加。对于八连通邻居的情况,过滤器应如下所示:

>> 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

如果您想要四个连接的邻居,您可以将过滤器的角设为 0。类似地,您可以根据您的目的设计任何过滤器,例如对所有邻居进行平均而不是对它们求和。

详情请看维基百科中的卷积文章

于 2013-03-12T10:14:38.097 回答
1

两种可能性:将循环的限制更改为i=k:(m-k)j=k:(n-k)或使用blkproc

前任 :

计算每个 8×8 块的二维 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,那么您将采用元素 (M, j) 而不是采用元素 (i-1, j) = (0, j)。

由于您的代码提到了“您的老师”,我猜您可以询问边缘应该发生什么(或者以合理的方式解决它很可能是任务的一部分!!)。

于 2013-03-12T15:56:07.303 回答