这里有一点一定要注意,因为为无向图,因此邻接矩阵一定要是关于对角线对称的,即Aij=Aji(且对角线上元素Aii=0),两点之间相互无向连接,有向图可以不为对称矩阵(有方向)

方法及函数:

1.推荐matlab一个图论很好用的包Graph and Network Algorithms,官网有函数介绍https://www.mathworks.com/help/matlab/graph-and-network-algorithms.html

这里搬一个知乎很不错评论的demo,仅供参考(参考链接文末一起放出):

%% Matlab 无向图
% 生成数据,A和邻接矩阵的形势相似
A = magic(10);
A = dist(A);%计算点之间的欧氏距离
index = 1:size(A,1);
names = {};
for ii = index
    names{ii} = num2str(index(ii));
end
% 定义图像G
G = graph(A,names)
%% 绘制图像
figure
plot(G,'rs-','LineWidth',2,'MarkerSize',10)

 

还可以改变各个节点之间的绘图方式

%% 绘制图像 定义图像的图层为圆形
figure
plot(G,'ro-','Layout','circle','LineWidth',2,'MarkerSize',10)
<img src="https://pic1.zhimg.com/50/v2-96c490f5c4126fa150e5bc56688bc6db_hd.jpg" data-caption="" data-size="normal" data-rawwidth="560" data-rawheight="420" data-default-watermark-src="https://pic3.zhimg.com/50/v2-e4b7648f26b717dba1f56b58662e9698_hd.jpg" class="origin_image zh-lightbox-thumb" width="560" data-original="https://pic1.zhimg.com/v2-96c490f5c4126fa150e5bc56688bc6db_r.jpg"/>

如果每个节点是有坐标的,也可以指定节点在空间中的位置

%% 指定每个点的坐标
x = randperm(10)
y = randperm(20,10)
figure
p = plot(G,'ro-','LineWidth',2,'MarkerSize',10)
p.XData = x
P.YData = y

2.使用gplot()

gplot(A, xy):
    A表示邻接矩阵,xy表示每个点的位置

如下定义一个函数 netplot,将每个点均匀地放置在单位圆上以画出邻接矩阵

function netplot(G)
    n = size(G, 1);
    [x y] = pol2cart((0:n-1)*2*pi/n, 1);
    gplot(G, [x' y'], '-o');
end

[X,Y] = POL2CART(TH,R)将极坐标(角度TH和半径R)存储的数据中相应的元素转换到笛卡儿坐标X,Y。数组TH和R必须大小相同(或者二者皆可标量),TH必须是弧度值。 

[X,Y,Z] = POL2CART(TH,R,Z)将圆柱坐标(角度TH、半径R和高度Z)存储的数据中相应的元素转换到笛卡儿坐标X,Y,Z。数组TH、R和Z必须大小相同(或者其中任何一个皆可标量),TH必须是弧度值。

调用如示:

a = [0 1 1 0; 1 0 1 0; 1 0 0 1; 0 0 1 0];
netplot(a);

输出如图所示:

参考网址:

https://www.zhihu.com/question/275337007

https://zhidao.baidu.com/question/680827699342938012.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐