图分为有向图和无向图,其中无向图可以视为有向图的特例,因为无向图可视作两个点之间存在两条方向相反的边。
在matlab中主要使用矩阵进行图的描述,其中最常用的还是邻接矩阵和关联矩阵,这两种表示方式是等价的,只是角度不同。
这两个矩阵的具体定义网上都有很多,这里就不具体列出来,只谈谈我的理解。
邻接矩阵是一个方阵(行数=列数),矩阵的行和列的含义都是顶点。对于无向图,如果顶点vi和vj有边相连,则邻接矩阵的A(i,j)和A(i,j)都是1,反之为零;对于有向图,如果有边从顶点vi指向顶点vj,那么A(i,j)为1。
图1
如图1,是一个具有四个顶点的图,那么邻接矩阵是一个4*4的方阵
通过matlab描述该图如下
A = [0 1 1 1; 1 0 1 0; 1 1 0 1; 1 0 1 0]
可以看出,这是一个对称矩阵,这是无向图的特点。图中边e3连接顶点v3和v4,所以A(3,4)和A(4, 3)为1,其他雷同。
对于下图2的matlab描述如下
A = [0 1 1 0; 0 0 0 0; 0 1 0 1; 1 0 0 0]
关联矩阵是一个m*n的矩阵,m(行数)的含义是顶点数,n(列数)的含义是边数,相对来说,关联矩阵表达的内容更丰富,但邻接矩阵更容易通过图得到,各有优缺点。如果边ej的起点是vi,那么关联矩阵、M(i,j)为1,如果vi是ej的端点但不是起点(不是终点,之所以这样说是考虑到无向图,因为无向图虽然既是起点也是终点,但关联矩阵中不考虑边的终点,为了防止前后矛盾),那么关联矩阵、M(i,j)为-1,其他为0,当然了,对于无向图,因为一条无向边可以看作两条方向相反的有向边,所以对于ej的两个端点都看作边ej的起点,都为1。
图2
图2的关联矩阵用matlab描述如下
M = [1 0 0 0 1; -1 -1 0 0 0; 0 1 1 0 -1; 0 0 -1 1 0]
可以看出关联矩阵M的列想加起来都是0,这是因为一条边,必定有一个端点是起点,另一个点不是起点。
图1的关联矩阵用matlab描述如下
M = [1 0 0 0 1; 1 1 0 0 0; 0 1 1 0 1; 0 0 1 1 0]
附关联矩阵和邻接矩阵的转化matlab代码
function W=incandadf(G,f)
% 关联矩阵和邻接矩阵的转化
% G 图的相应矩阵
% f=0, 邻接矩阵转化为关联矩阵
% f=1,关联矩阵转化为邻接矩阵
% W 转化结果
if f==0 % 邻接矩阵转化为关联矩阵
m=sum(sum(G))/2; % 计算图的边数
n=size(G,1);
W=zeros(n,m);
k=1;
for i=1:n
for j=i:n
if G(i,j)~=0
W(i,k)=1; % 给边的始点赋值为1
W(j,k)=1; % 给边的终点赋值为1
k=k+1;
end
end
end
elseif f==1 % 关联矩阵转化为邻接矩阵
m=size(G,2);
n=size(G,1);
W=zeros(n,n);
for i=1:m
a=find(G(:,i)~=0); %找出G第i行中等于1的位置
W(a(1),a(2))=1; % 存在边则邻接矩阵的对应值为1
W(a(2),a(1))=1;
end
else
fprint('please input the right value of f');
end
W;
% 有向图的关联矩阵和邻接矩阵转化
function W=mattransf(G,f)
% f=0, 邻接矩阵转化为关联矩阵
% f=1,关联矩阵转化为邻接矩阵
if f==0 % 邻接矩阵转化为关联矩阵
m=sum(sum(G));
n=size(G,1);
W=zeros(n,m);
k=1;
for i=1:n
for j=1:n
if G(i,j)~=0 % 由i发出的边,有向边的始点
W(i,k)=1; % 关联矩阵始点值为1
W(j,k)=-1; % 关联矩阵终点值为-1
k=k+1;
end
end
end
elseif f==1 % 关联矩阵转化为邻接矩阵
m=size(G,2);
n=size(G,1);
W=zeros(n,n);
for i=1:m
a=find(G(:,i)~=0); % 找出G第i行中等于1和-1的位置
if G(a(1),i)==1
W(a(1),a(2))=1; % 有向边由a(1)指向a(2)
else
W(a(2),a(1))=1; % 有向边由a(2)指向a(1)
end
end
else
fprint('please input the right value of f');
end
W;