Matlab - 周围元素的总和

时间:2013-03-12 10:10:41

标签: matlab sum

我想计算矩阵中给定元素周围元素的总和。到目前为止,我已经写了这些代码:

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变为零。任何人都知道如何在不收到此错误的情况下执行此操作?

3 个答案:

答案 0 :(得分:12)

您可以通过过滤对元素求和。 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的角。同样,你可以为你的目的设计任何过滤器,例如平均所有邻居而不是求它们。

有关详细信息,请参阅维基百科中的convolution article

答案 1 :(得分:1)

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

前:

  

计算每个8乘8块的2-D DCT

I = imread('cameraman.tif');
fun = @dct2;
J = blkproc(I,[8 8],fun);
imagesc(J), colormap(hot)

答案 2 :(得分:0)

你可以在边缘做很多事情。你做的具体取决于你的问题,不同于用例和用例。典型的事情:

  1. 如果(i-1)或(i + 1)超出范围,则忽略该元素。这相当于在矩阵周围用零填充零填充,并相应地调整循环限制
  2. 缠绕边缘。换句话说,对于MxN矩阵,如果(i-1)将您带到0,则取代元素(i-1,j)=(0,j)而不是取元素(M,j)。
  3. 由于您的代码提及“您的老师”,我猜您可以询问边缘应该发生什么(或者以合理的方式处理它可能是任务的一部分!!)。