我想计算矩阵中给定元素周围元素的总和。到目前为止,我已经写了这些代码:
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变为零。任何人都知道如何在不收到此错误的情况下执行此操作?
答案 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)
你可以在边缘做很多事情。你做的具体取决于你的问题,不同于用例和用例。典型的事情:
由于您的代码提及“您的老师”,我猜您可以询问边缘应该发生什么(或者以合理的方式处理它可能是任务的一部分!!)。