matlab:栅格地图转化为邻接矩阵

function D=G2D(G) %邻接矩阵就是每个栅格之间的距离
[m,n]=size(G); %返回矩阵G的尺寸 并将行返回到m中,列返回到n中
N=m*n; %元素个数   
D=zeros(N,N); %生成一个n*n的0矩阵
for Dx=1:N               
    for Dy=Dx:N       
        x1=ceil(Dx/n);%返回不小于x的最小整数值
        y1=mod(Dx,n); %Dx对n取余
        if y1==0
            y1=n;
        end
        x2=ceil(Dy/n);
        y2=mod(Dy,n);
        if y2==0
            y2=n;
        end
      if Dx==Dy
          D(Dx,Dy)=inf;
      elseif (G(x1,y1)==1) || (G(x2,y2)==1);
            D(Dx,Dy)=inf;
      else
            if (mod(Dx,n) ==1)
                if(Dx==1)
                    if (Dy-Dx==1) || (Dy-Dx==n)
                        D(Dx,Dy)=1;
                    elseif (Dy-Dx==n+1)
                        D(Dx,Dy)=sqrt(2);
                    else
                        D(Dx,Dy)=inf;
                    end
                elseif(Dx==N-n+1)
                    if (Dy-Dx==1) || (Dx-Dy==n)
                        D(Dx,Dy)=1;
                    elseif (Dx-Dy==n-1)
                        D(Dx,Dy)=sqrt(2);
                    else
                        D(Dx,Dy)=inf;
                    end
                else
                    if (Dy-Dx==1) || (Dy-Dx==n) || (Dx-Dy==n)
                        D(Dx,Dy)=1;
                    elseif (Dx-Dy==n-1) || (Dy-Dx==n+1)
                        D(Dx,Dy)=sqrt(2);
                    else
                        D(Dx,Dy)=inf;
                    end
                end
                
            elseif mod(Dx,n) ==0
                if(Dx==n)
                    if (Dx-Dy==1) || (Dy-Dx==n)
                        D(Dx,Dy)=1;
                    elseif (Dy-Dx==n-1)
                        D(Dx,Dy)=sqrt(2);
                    else
                        D(Dx,Dy)=inf;
                    end
                elseif(Dx==N)
                    if (Dx-Dy==1) || (Dy-Dx==n)
                        D(Dx,Dy)=1;
                    elseif (Dy-Dx==n+1)
                        D(Dx,Dy)=sqrt(2);
                    else
                        D(Dx,Dy)=inf;
                    end
                else
                    if (Dx-Dy==1) || (Dy-Dx==n) || (Dx-Dy==n)
                        D(Dx,Dy)=1;
                    elseif (Dy-Dx==n-1) || (Dx-Dy==n+1)
                        D(Dx,Dy)=sqrt(2);
                    else
                        D(Dx,Dy)=inf;
                    end
                end
                
            else
                if (Dx-Dy==1) || (Dy-Dx==1) || (Dy-Dx==n) || (Dx-Dy==n)
                    D(Dx,Dy)=1;
                elseif (Dx-Dy==n+1) || (Dy-Dx==n+1) || (Dy-Dx==n-1) || (Dx-Dy==n-1)
                    D(Dx,Dy)=sqrt(2);
                else
                    D(Dx,Dy)=inf;
                end
            end
      end
    end
end
for i=1:N
    for j=i:N
        if(i~=j)
            D(j,i)=D(i,j);
        end
    end
end

        传入0/1矩阵形式的栅格地图(如下图中的[1 0 0;0 0 0;0 0 0]矩阵<右图,黑色为障碍物1>),将其转换为如下图所示的邻接矩阵,1表示障碍物,不可达;0表示没有被占据,可以通过。则1号与所有元素都不可达为inf,并且将自身与自身也设为不可达:

 

matlab:栅格地图转化为邻接矩阵_第1张图片matlab:栅格地图转化为邻接矩阵_第2张图片

其在蚁群算法路径规划中的应用可参考https://blog.csdn.net/KantsWang/article/details/83753515

代码均为他人代码,只作学习参考之用。

 

 

你可能感兴趣的:(数据/算法)