Matlab-周围元素之和

Matlab-周围元素之和,matlab,sum,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)

我想计算矩阵中给定元素周围元素的和。到目前为止,我已经编写了以下几行代码:

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变为零。有人知道如何在不出错的情况下做到这一点吗

您可以通过过滤对元素求和。可用于这种方式

让我举个例子。我创建了一个样本矩阵

>> 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
对应的位置求和。对于八个相邻连接的情况,过滤器应如下所示:

>> 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。类似地,您可以为自己的目的设计任何过滤器,例如对所有邻居求平均,而不是求和


有关详细信息,请参阅Wikipedia中的。

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

例:

计算每个8×8块的二维DCT


你可以在边缘做很多事情。具体的做法取决于您的问题,并且在不同的用例中是不同的。要做的典型事情:

  • 如果(i-1)或(i+1)超出范围,则忽略该元素。这相当于在矩阵外部用零填充,并相应地调整循环限制
  • 把边缘包起来。换句话说,对于MxN矩阵,如果(i-1)取0,则取元素(i-1,j)=(0,j)而不是元素(M,j)
    既然你的代码提到了“你的老师”,我想你可以问在边缘应该发生什么(或者以一种明智的方式解决它可能是任务的一部分!!)

    哈,刚才也在写同样的东西!:)如果它对你有效,你可以接受答案作为你问题的解决方案。这非常有帮助,那也是:)我想你不熟悉Stackoverflow。通过单击答案左角的勾号即可接受答案。或者,如果您有图像处理工具箱,请使用blkproc METHINKSO环绕边缘如何?可以使用conv2或blkproc以简单的方式完成吗?老实说,我不确定。我想conv2 zero会在边缘上移动,但我不能确定。
    I = imread('cameraman.tif');
    fun = @dct2;
    J = blkproc(I,[8 8],fun);
    imagesc(J), colormap(hot)