在Matlab中,我有一个由非负数构成的矩阵A,如下所示:
A=[0 2 3 5 4 7 8 1 8 2 7 5 2 9 0 1 2 4 8 0 5 2 4 8 6 0 5 8 1 1 2 5 8 3 6];
我想找到除零元素外的所有零元素的邻居。这意味着我想在向量v中存储A(1, 1)、A(2, 5)、A(3, 1)、A(3, 6)、A(4, 5)和A(5, 1)的邻居,如果其中一个邻居为零,则不存储它。
通过元素(i, j)的邻居,我指的是距离(i, j)一个元素远的元素,即A(i, j+1)、A(i, j-1)、A(i-1, j)、A(i-1, j-1)、A(i-1, j+1)、A(i+1, j)、A(i+1, j-1)和A(i+1, j+1)。每个元素(i, j)都有7个邻居。
我不存储重复的元素。这意味着,如果例如A(1, 1)=0并且A(1,3)=0并且A(1,2)=1,那么我只会存储A(1, 2)一次。
在我的先前的示例中,向量v将是以下内容:
v=[2 1 8 1 2 4 5 2 9 8 5 5 8 4 6 5 8 3];
如何在Matlab中不使用循环来完成这个操作?
这是我用于正方形矩阵的代码: cl_ 是矩阵中零元素的数量。ix_ 是零元素的行索引,iy_ 是零元素的列索引。
for i_=1:length(cl_)
ixn1_(1:2)=ix_(i_);
ixn2_(1:3)=ix_(i_)-1;
ixn3_(1:3)=ix_(i_)+1;
iyn1_=iy_(i_)-1;
iyn2_=iy_(i_)+1;
iyn3_(1:3)=[iy_(i_)-1, iy_(i_), iy_(i_)+1];
ixn_{i_}=[ixn1_, ixn2_, ixn3_];
iyn_{i_}=[iyn1_, iyn2_, repmat(iyn3_, 1, 2)];
end
% find the neighbors