在Matlab中有条件地查找八个邻居的行数和列数

时间:2013-01-25 03:36:14

标签: algorithm matlab graph matrix

我有一个6 * 6矩阵

A=
  3     8     8     8     8     8
  4     6     1     0     7    -1
  9     7     0     2     6    -1
  7     0     0     5     4     4
  4    -1     0     2     8     1
  1    -1     0     8     3     9

我有兴趣从A(4,4)= 5开始查找邻居的行数和列数。但是只有当A(4,4)右边的元素4,左边的6,顶部的2,左上角的底部1的8,对角线的右边的3,它们才会被链接到A(4,4)作为邻居,对角线左下角7,对角线右下角9。更清楚的是,如果邻居围绕A(4,4),A(4,4)会有邻居:

 1     2     3;
 6     5     4;
 7     8     9;

当每个邻居被发现时,这将继续。 0和-1也将被忽略。最后,我希望这些单元格的行号和列号如下图所示。有没有办法可视化这个网络。这只是样本。我真的有一个庞大的矩阵。

enter image description here

1 个答案:

答案 0 :(得分:1)

A = [3     8     8     8     8     8;
     4     6     1     0     7    -1;
     9     7     0     2     6    -1;
     7     0     0     5     4     4;
     4    -1     0     2     8     1;
     1    -1     0     8     3     9];

test = [1 2 3; 
        6 5 4; 
        7 8 9];

%//Pad A with zeros on each side so that comparing with test never overruns the boundries    
%//BTW if you have the image processing toolbox you can use the padarray() function to handle this
P = zeros(size(A) + 2);        
P(2:end-1, 2:end-1) = A;

current = zeros(size(A) + 2);
past = zeros(size(A) + 2);

%//Initial state (starting point)
current(5,5) = 1; %//This is A(4,4) but shifted up 1 because of the padding

condition = 1;

while sum(condition(:)) > 0;
      %//get the coordinates of any new values added to current
     [x, y] = find(current - past); 
     %//update past to last iterations current
     past = current; 

     %//loop through all the coordinates returned by find above
     for ii=1:size(x); 

         %//Make coord vectors that represent the current coordinate plus it 8 immediate neighbours.
         %//Note that this is why we padded the side in the beginning, so if we hit a coordinate on an edge, we can still get 8 neighbours for it!
         xcoords = x(ii)-1:x(ii)+1; 
         ycoords = y(ii)-1:y(ii)+1; 

         %//Update current based on comparing the coord and its neighbours against the test matrix, be sure to keep the past found points hence the OR
         current(xcoords, ycoords) = (P(xcoords, ycoords) == test) | current(xcoords, ycoords); 

     end 

     %//The stopping condition is when current == past
     condition = current - past;

 end 

%//Strip off the padded sides
FinalAnswer = current(2:end-1, 2:end-1)
[R, C] = find(FinalAnswer);
coords = [R C] %//This line is unnecessary, it just prints out the results at the end for you.

好的,你非常接近,所以这是循环的最终解决方案。它运行大约0.002秒,所以我认为这很快。输出是

FinalAnswer =

     0     0     0     0     0     0
     0     1     1     0     0     0
     0     1     0     1     0     0
     1     0     0     1     1     1
     0     0     0     0     1     0
     0     0     0     0     0     1


coords =

     4     1
     2     2
     3     2
     2     3
     3     4
     4     4
     4     5
     5     5
     4     6
     6     6