matlab根据邻接矩阵作图
第二章 MATLAB的基础语法-矩阵与画图
2.1.4 矩阵的运算
1. MATLAB中矩阵运算符: + 加法;- 减法;’ 转置;* 乘法;^ 乘幂;\ 左除;/ 右除。 2. 注意:它们要符合矩阵运算的规律,如果矩阵的行 列 数不符合运算符的要求,将产生错误信息。 3. 举例:左除和右除的用法: 设A是可逆矩阵, ①、AX=B 的解是A 左除B,即 X=A\B
>>A(1:2:3,4:-1:2)↙ >>D(:,1)=[]↙%删除D的第1列,[ ]为空集符号 D= 0 1
2. 矩阵的拼接
定义:将几个矩阵接在一起称为拼接。 注意:左右拼接时行数相同,上下拼接时列数相同。
例题
>>E=[D,zeros(2,1)]↙ E = 2 3 0 5 6 0
2 3 D= 5 6
d =
e = -1.2000
3.1000
0
3.1000
4.0000
6.0000
2.4.3 矩阵函数
MATLAB有大量的 处 理矩阵的函数,从其作用 来 看可分为 两 类: 构造矩阵的函数;进行矩阵计算的函数。对于前者,我们已经 介绍了
构造矩阵的函数
eye(单位阵)
zeros(0阵)
ones(1阵)
2.4.2 向量函数
有些函数只有当它们作用于(行或列)向量时才有意义,称为 向量函数,这些函数也可以作用于矩阵,此时它产生一个行向 量,行向量的每个元是函数作用于矩阵相应列向量的结果。常 用的有: max,min,sum( 和 ) , length( 长 度 ) ,mean( 平 均 值 ) median(中值),prod(乘积),sort(从小到大排列) 例 >>a=[4 3.1 -1.2 0 6]; b=min(a),c=sum(a),d=median(a),e=sort(a) ↙ b = c = 11.9000 -1.2000
MATLAB矩阵生成无向网络图
MATLAB矩阵⽣成⽆向⽹络图 寝室有⼀个是做⽹络的,需要把矩阵变为⽹络图使其形象⼀点,所以我在这⾥就写了这样⼀个函数。
功能是将邻接矩阵或关联矩阵变为⽹络图,不过我这⾥只能转换为⽆向图,有向图的箭头我还需要在研究⼀下,似乎有annotation函数可以调⽤。
1 %函数名netplot2 %使⽤⽅法输⼊请help netplot3 %⽆返回值%函数只能处理⽆向图4 %作者:tiandsp5 %最后修改:2012.12.266 function netplot(A,flag)7 %调⽤⽅法输⼊netplot(A,flag),⽆返回值8 %A为邻接矩阵或关联矩阵9 %flag=1时处理邻接矩阵10 %flag=2时处理关联矩阵11 %函数只能处理⽆向图12if flag==1 %邻接矩阵表⽰⽆向图13 ND_netplot(A);14return;15 end1617if flag==2 %关联矩阵表⽰⽆向图18 [m n]=size(A); %关联矩阵变邻接矩阵19 W=zeros(m,m);20for i=1:n21 a=find(A(:,i)~=0);22 W(a(1),a(2))=1;23 W(a(2),a(1))=1;24 end25 ND_netplot(W);26return;27 end2829 function ND_netplot(A)30 [n n]=size(A);31 w=floor(sqrt(n));32 h=floor(n/w);33 x=[];34 y=[];35for i=1:h %使产⽣的随机点有其范围,使显⽰分布的更⼴36for j=1:w37 x=[x 10*rand(1)+(j-1)*10];38 y=[y 10*rand(1)+(i-1)*10];39 end40 end41 ed=n-h*w;42for i=1:ed43 x=[x 10*rand(1)+(i-1)*10];44 y=[y 10*rand(1)+h*10];45 end46 plot(x,y,'r*');4748 title('⽹络拓扑图');49for i=1:n50for j=i:n51if A(i,j)~=052 c=num2str(A(i,j)); %将A中的权值转化为字符型53 text((x(i)+x(j))/2,(y(i)+y(j))/2,c,'Fontsize',10); %显⽰边的权值54 line([x(i) x(j)],[y(i) y(j)]); %连线55 end56 text(x(i),y(i),num2str(i),'Fontsize',14,'color','r'); %显⽰点的序号57 hold on;58 end59 end60 end6162 end调⽤⽅法⾥⾯都写了,我就不多说了。
利用matlab绘制矩阵色块图
R语言中有一个根据实值矩阵绘制色块图的程序(用于绘制相关系数矩阵图),可以用丰富的颜色和形状形象的展示矩阵元素值的大小。
遗憾的是MATLAB中没有这样的函数,因此我就用MATLAB编写了一个matrixplot函数,下面给出示例和源码,与大家一起分享!**********************************************【例1】绘制网格线,网格中显示矩阵元素。
显示黑色文字:>> x = [1,-0.2,0.3,0.8,-0.5-0.2,1,0.6,-0.7,0.20.3,0.6,1,0.5,-0.30.8,-0.7,0.5,1,0.7-0.5,0.2,-0.3,0.7,1];>> XVarNames = {'xiezhh','heping','keda','tust','tianjin'};>>matrixplot(x,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames',XVarNam es);效果图1:根据矩阵元素值自动设置文字颜色:>>matrixplot(x,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames',XVarNam es,'TextColor','Auto','ColorBar','on');【例2】绘制实值矩阵各元素对应的色块,通过不同的“参数/参数值”控制色块的形状、大小、颜色等属性。
方形色块,充满方格,灰白色字体>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'TextColor',[0. 6,0.6,0.6],'ColorBar','on');效果图3:方形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','o ff','FigSize','Auto','ColorBar','on');椭圆形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','o ff','FigSize','Auto','ColorBar','on','FigShape','e');效果图5:圆形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体,上三角形式显示>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','o ff','FigSize','Auto','ColorBar','on','FigShape','c','FigStyle','Triu');六边形色块,根据矩阵元素值自动确定色块的大小和颜色,显示字体,下三角形式显示>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','o n','FigSize','Auto','ColorBar','on','FigShape','h','FigStyle','Tril');效果图7:表盘形色块,根据矩阵元素值自动确定色块的颜色,不显示字体>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','o ff','FigSize','Full','ColorBar','on','FigShape','d');【例3】读取真彩图片,绘制伪红外图。
上海市地铁网络拓扑结构性质分析
上海市地铁网络拓扑结构性质分析郑苏江【摘要】本文基于复杂网络理论,将上海市现运行的16条地铁线路在Space-L方法下建立模型,通过Ucinet软件初步绘制了地铁网络的拓扑结构图.根据站点邻接矩阵,运用Matlab计算得出:绝大多数站点的度值为2,站点的度分布基本与泊松分布相似;超过97%的站点聚类系数为0,所有站点的平均聚类系数极小,平均路径长度值为15.12,不具有小世界网络的特性;在双对数坐标下的站点累计度分布基本符合幂率分布,具有无标度网络的特性.【期刊名称】《智能计算机与应用》【年(卷),期】2019(009)004【总页数】4页(P205-208)【关键词】复杂网络;Space-L;上海市地铁网【作者】郑苏江【作者单位】上海工程技术大学管理学院,上海201620【正文语种】中文【中图分类】TP393.020 引言自20世纪末以来,伴随网络科学的飞速发展,尤其是在复杂网络的“小世界特性”以及“无标度特性”方面,世界范围内的专家学者开始对网络科学产生了浓厚的研究热情。
随着研究范围的层层深入,很多专家学者也逐渐将研究兴趣指向了城市交通网络的复杂网络特性之中。
Jiang[1]对比分析了不同城市的公路分布情况以及城市公路网络的小世界网络特性;Sienkiewicz[2]实证研究了22个城市的交通网络拓扑特性,研究结果表明那些城市的网络度分布不是服从幂律分布就是服从指数分布;Latora[3]以美国波士顿地铁为例,初步研究了该网络的小世界网络特性,并首次提出了一种网络构造法则,定义了网络效率等于2个地铁站(节点)之间距离的倒数,同时根据网络效率对其有效性和容错性作出衡量。
在国内,郭露露[4]等对北京市地铁网络使用 Space L 方法构建拓扑网络模型,针对连通OD对和出行效率2个因素评估了该地铁网络的脆弱性,并对今后北京市地铁运营时防护措施的制定给予相关建议;李进[5]研究了国内多个大型城市的地铁网络拓扑特性,在总结这些城市的地铁网络共性的同时,与北京市地铁网络的鲁棒性进行对比研究;高天智[6]等以国内10个典型城市作为研究样本,基于复杂网络理论对比分析了其网络拓扑特性,对微观及宏观特性表征指标进行了重点研究并总结出国内地铁网络的相关特征;孙军艳等[7]对西安市的公交网络、地铁网络及二者综合构成的复杂网络以Space-L的方式建立模型,对比分析了3类网络的统计特征及网络拓扑特性。
利用matlab绘制矩阵色块图教程文件
利用m a t l a b绘制矩阵色块图R语言中有一个根据实值矩阵绘制色块图的程序(用于绘制相关系数矩阵图),可以用丰富的颜色和形状形象的展示矩阵元素值的大小。
遗憾的是MATLAB中没有这样的函数,因此我就用MATLAB编写了一个matrixplot 函数,下面给出示例和源码,与大家一起分享!**********************************************【例1】绘制网格线,网格中显示矩阵元素。
显示黑色文字:>> x = [1,-0.2,0.3,0.8,-0.5-0.2,1,0.6,-0.7,0.20.3,0.6,1,0.5,-0.30.8,-0.7,0.5,1,0.7-0.5,0.2,-0.3,0.7,1];>> XVarNames = {'xiezhh','heping','keda','tust','tianjin'};>>matrixplot(x,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames', XVarNames);效果图1:根据矩阵元素值自动设置文字颜色:>>matrixplot(x,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames', XVarNames,'TextColor','Auto','ColorBar','on');效果图2:【例2】绘制实值矩阵各元素对应的色块,通过不同的“参数/参数值”控制色块的形状、大小、颜色等属性。
Matlab数据可视化(4):一维数据绘图II
Matlab数据可视化(4):一维数据绘图II五. 结点连接图(node link plot)(源代码:NodeLinks.m)有时,我们需要绘制出不同结点之间的连通关系,即结点连接图。
以下以绘制美国128座城市之间的连通关系为例,介绍两种结点连接图的画法。
1) 定义每座城市与距它最近的城市连通,与其余视为不连通,然后根据连通性,利用gplot命令,直观的绘出结点连接图。
(图9)[plain]view plaincopy1.%% #12.%% 定义数据3.[XYCoord] = xlsread('inter_city_distances.xlsx','Sheet3');4.[intercitydist citynames] = xlsread('inter_city_distances.xlsx','Distances');5.6.% 避免将自身判定为最近的城市7.howManyCities = 128;8.for i =1:howManyCities;intercitydist(i,i)=Inf;end9.10.%% 定义临接矩阵11.% n阶方阵,1表示相连,0表示不相连; 这是我们规定城市只与它最近的城市相连12.adjacency = zeros(howManyCities,howManyCities);13.for i = 1:howManyCities14.alls = find(intercitydist(i,:)==min(intercitydist(i,:)));15.for j = 1:length(alls)16.adjacency(i,alls(j)) = 1;17.adjacency(alls(j),i) = 1;18.end19.clear alls20.end21.figure('units','normalized','position',[ 0.2813 0.2676 0.3536 0.3889]);22.plot(XYCoord(1:howManyCities,1),XYCoord(1:howMan yCities,2),'ro');hold on;23.title('距离最近的城市彼此相连');24.gplot(adjacency,XYCoord);25.xlabel('南北');26.ylabel('东西');27.set(gcf,'Color',[1 1 1],'paperpositionmode','auto');图 92) 定义距离小于100英里的城市为相连,以更紧致的方式绘出连接情况。
matlab实现dijkstra算法
matlab实现dijkstra算法Matlab实现Dijkstra算法第一段:什么是Dijkstra算法,为什么它重要?Dijkstra算法是一种用于解决最短路径问题的经典算法。
它由荷兰计算机科学家Edsger Dijkstra在1956年提出,被广泛应用于网络路由、地图导航和图论等领域。
该算法的核心思想是在给定的带权图中找到从起点到终点的最短路径,通过迭代的方式逐步推进,直到找到最短路径或处理完所有节点。
Dijkstra算法被广泛认为是一种高效、可靠的解决方案,具有良好的理论基础和实际应用性。
第二段:如何在Matlab中实现Dijkstra算法?在Matlab中实现Dijkstra算法,可以分为以下几个步骤:1. 创建带权图:我们需要将问题转化为带权图的形式。
在Matlab中,可以使用邻接矩阵来表示图的连接关系,其中每个边的权重存储在矩阵中的对应位置。
2. 初始化距离和路径:将起点到每个节点的距离初始化为无穷大,并为每个节点设置一个空路径。
将起点的距离设置为0,表示起点到自身的距离为0。
3. 遍历节点:循环遍历所有节点,找到距离起点最近的节点,并标记为已访问。
更新与该节点相邻节点的距离和路径信息。
如果经过当前节点到达某个相邻节点的距离更短,则更新该节点的距离和路径。
4. 重复步骤3,直到所有节点都被遍历为止。
这样,我们就能得到从起点到其他节点的最短路径信息。
第三段:个人观点和理解Dijkstra算法是解决最短路径问题的经典算法之一,它具有广泛的应用价值。
在日常生活中,我们经常需要找到最佳的路径规划,例如快递员送货时选择最短路径、地铁或公交车乘客选择最快到达目的地的路线等。
对于这些问题,Dijkstra算法可以提供一个可靠、高效的解决方案。
在使用Matlab实现Dijkstra算法时,我们可以利用Matlab强大的矩阵运算能力和易用的函数库来简化算法的实现过程。
Matlab还提供了丰富的可视化工具,可以帮助我们直观地展示算法执行过程和结果。
第4讲 MATLAB矩阵分析及绘图
2 矩阵的转置与旋转
(1)矩阵的转置 转置运算符是单撇号(‘)。 (2)矩阵的旋转 利用函数rot90(A,k)将矩阵A旋转90º 的k倍,当k为1时可省略。
(3)矩阵的左右翻转
对矩阵实施左右翻转是将原矩阵的第一列和最后一列 调换,第二列和倒数第二列调换,…,依次类推。 MATLAB对矩阵A实施左右翻转的函数是fliplr(A)。 (4)矩阵的上下翻转
当选项省略时,MATLAB规定,线型一律用实线,颜色将
根据曲线的先后顺序依次。
要设置曲线样式可以在plot函数中加绘图选项,其调用格 式为: plot(x1,y1,选项1,x2,y2,选项2,…,xn,yn,选项n)
>> x=0:pi/15:2*pi;
>> y1=sin(x); y2=cos(x); >> plot(x,y1,'b:+',x,y2,'g-.*')
>> y=[1 2 3;4 5 6;7 8 9];
>> plot(x,y);
(2) 当x,y是同维矩阵时,则以x,y对应列元素为横、纵
坐标分别绘制曲线,曲线条数等于矩阵的列数。 >> x=[1 2 3;4 5 6;7 8 9]; >> y=[7 8 9;1 2 3;4 5 6]; >> plot(x,y); (3) 对只包含一个输入参数的plot函数,当输入参数是实矩阵 时,则按列绘制每列元素值相对其下标的曲线,曲线条数等 于输入参数矩阵的列数。 >> x=[1 2 3;4 5 6;7 8 9]; >> plot(x,y);
MATLAB矩阵运算与绘图实践
MATLAB矩阵运算与绘图实践一、MATLAB矩阵运算的基本概念与操作MATLAB是一种强大的数学软件工具,可以用于矩阵运算和绘图实践。
在MATLAB中,矩阵是一种基本的数据类型,具有简洁而强大的数据处理功能。
1.1 矩阵的定义和表示矩阵是一个二维的数组,由行和列组成。
在MATLAB中,可以使用方括号进行矩阵的定义和表示。
例如,A = [1 2 3; 4 5 6]定义了一个2行3列的矩阵A。
1.2 矩阵的运算MATLAB提供了一系列的矩阵运算函数,包括加法、减法、乘法、转置等。
例如,可以使用A+B进行矩阵的加法运算,A-B 进行矩阵的减法运算,A*B进行矩阵的乘法运算。
1.3 矩阵的索引与切片在MATLAB中,可以使用索引和切片操作来访问矩阵的特定元素或子矩阵。
例如,可以使用A(1,2)来访问矩阵A的第1行第2列的元素,使用A(1,:)来访问矩阵A的第1行的所有元素。
1.4 矩阵的运算速度优化MATLAB中的矩阵运算通常使用向量化操作,可以显著提高运算速度。
向量化操作是指将循环结构转换为矩阵运算表达式的操作。
例如,可以使用A.*B进行矩阵的逐元素相乘运算,而不是使用循环结构逐个相乘。
二、MATLAB矩阵运算的高级应用2.1 矩阵的特征值和特征向量在MATLAB中,可以使用eig函数计算矩阵的特征值和特征向量。
特征值和特征向量是矩阵的重要属性,可以用于矩阵的分类和分析。
2.2 矩阵的奇异值分解奇异值分解(SVD)是一种常用的矩阵分解方法,在MATLAB中可以使用svd函数进行奇异值分解。
SVD可以将一个矩阵分解为三个矩阵的乘积,可以用于矩阵的降维和数据压缩。
2.3 矩阵的LU分解LU分解是一种常用的矩阵分解方法,可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积,在MATLAB中可以使用lu函数进行LU分解。
LU分解可以用于矩阵的求解和矩阵方程的求解。
三、MATLAB绘图实践的基本技巧与命令3.1 绘图函数的选择在MATLAB中,有多种绘图函数可以用于实现不同类型的图形。
matlab floyd算法
matlab floyd算法
一、算法思想
Floyd算法是一种用于解决最短路径问题的算法,它可以找出任意两点之间的最短路径。
它由西班牙数学家Robert Floyd在1960年提出,是一种动态规划的应用,其可以求出任意两点之间的最短路径问题,由此可以证明,Floyd算法具备时间复杂度为O(n^3)的性质。
二、算法步骤
1、初始化:根据邻接矩阵表示图,初始化Floyd算法的距离矩阵。
2、迭代:使用Floyd算法的迭代式更新距离矩阵。
3、最短路径:最后获得的距离矩阵就是最短路径矩阵,可以求出任意两点之间的最短距离。
三、MATLAB实现
1、首先我们需要输入一个无向图的邻接矩阵,形如:
A=[0 1 inf 1;
1 0 1 inf;
inf 1 0 2;
1 inf
2 0];
2、利用matlab实现floyd算法,代码如下:
function dist = Floyd(A)
%A是图的邻接矩阵
n=size(A,1);
dist=A;
for i=1:n
for j=1:n
for k=1:n
if dist(j,k)>dist(j,i)+dist(i,k)
dist(j,k)=dist(j,i)+dist(i,k);
end
end
end
end
end
3、运行如下:
dist = Floyd(A)
dist =
0 1 3 1
1 0 1 2
3 1 0 2
1 2 2 0
即得到任意两点之间的最短路径,起点到终点最短路径长度为dist(i,j)。
(图论)matlab模板程序
第一讲:图论模型程序一:可达矩阵算法%根据邻接矩阵A〔有向图〕求可达矩阵P〔有向图〕function P=dgraf<A>n=size<A,1>;P=A;for i=2:nP=P+A^i;endP<P~=0>=1; %将不为0的元素变为1P;程序二:无向图关联矩阵和邻接矩阵互换算法F表示所给出的图的相应矩阵W表示程序运行结束后的结果f=0表示把邻接矩阵转换为关联矩阵f=1表示把关联矩阵转换为邻接矩阵%无向图的关联矩阵和邻接矩阵的相互转换function W=incandadf<F,f>if f==0 %邻接矩阵转换为关联矩阵m=sum<sum<F>>/2; %计算图的边数n=size<F,1>;W=zeros<n,m>;k=1;for i=1:nfor j=i:nif F<i,j>~=0W<i,k>=1; %给边的始点赋值为1W<j,k>=1; %给边的终点赋值为1k=k+1;endendendelseif f==1 %关联矩阵转换为邻接矩阵m=size<F,2>;n=size<F,1>;W=zeros<n,n>;for i=1:ma=find<F<:,i>~=0>;W<a<1>,a<2>>=1; %存在边,则邻接矩阵的对应值为1 W<a<2>,a<1>>=1;endelsefprint<'Please imput the right value of f'>;W;程序三:有向图关联矩阵和邻接矩阵互换算法%有向图的关联矩阵和邻接矩阵的转换function W=mattransf<F,f>if f==0 %邻接矩阵转换为关联矩阵m=sum<sum<F>>;n=size<F,1>;W=zeros<n,m>;k=1;for i=1:nfor j=i:nif F<i,j>~=0 %由i发出的边,有向边的始点W<i,k>=1; %关联矩阵始点值为1W<j,k>=-1; %关联矩阵终点值为-1k=k+1;endendendelseif f==1 %关联矩阵转换为邻接矩阵m=size<F,2>;n=size<F,1>;W=zeros<n,n>;for i=1:ma=find<F<:,i>~=0>; %有向边的两个顶点if F<a<1>,i>==1W<a<1>,a<2>>=1; %有向边由a<1>指向a<2>elseW<a<2>,a<1>>=1; %有向边由a<2>指向a<1>endendelsefprint<'Please imput the right value of f'>;endW;第二讲:最短路问题程序0:最短距离矩阵W表示图的权值矩阵D表示图的最短距离矩阵%连通图中各项顶点间最短距离的计算function D=shortdf<W>%对于W<i,j>,若两顶点间存在弧,则为弧的权值,否则为inf;当i=j时W<i,j>=0 n=length<W>;m=1;while m<=nfor i=1:nfor j=1:nif D<i,j>>D<i,m>+D<m,j>D<i,j>+D<i,m>+D<m,j>; %距离进行更新 endendendm=m+1;endD;程序一:Dijkstra算法〔计算两点间的最短路〕function [l,z]=Dijkstra<W>n = size <W,1>;for i = 1 :nl<i>=W<1,i>;z<i>=0;endi=1;while i<=nfor j =1 :nif l<i>>l<j>+W<j,i>l<i>=l<j>+W<j,i>;z<i>=j-1;if j<ii=j-1;endendendi=i+1;end程序二:floyd算法〔计算任意两点间的最短距离〕function [d,r]=floyd<a>n=size<a,1>;d=a;for i=1:nfor j=1:nr<i,j>=j;endendr;for k=1:nfor i=1:nfor j=1:nif d<i,k>+d<k,j><d<i,j>d<i,j>=d<i,k>+d<k,j>; r<i,j>=r<i,k>;endendendend程序三:n2short.m 计算指定两点间的最短距离function [P u]=n2short<W,k1,k2>n=length<W>;U=W;m=1;while m<=nfor i=1:nfor j=1:nif U<i,j>>U<i,m>+U<m,j>U<i,j>=U<i,m>+U<m,j>;endendendm=m+1;endu=U<k1,k2>;P1=zeros<1,n>;k=1;P1<k>=k2;V=ones<1,n>*inf;kk=k2;while kk~=k1for i=1:nV<1,i>=U<k1,kk>-W<i,kk>;if V<1,i>==U<k1,i>P1<k+1>=i;kk=i;k=k+1;endendendk=1;wrow=find<P1~=0>;for j=length<wrow>:-1:1P<k>=P1<wrow<j>>;k=k+1;endP;程序四、n1short.m<计算某点到其它所有点的最短距离> function[Pm D]=n1short<W,k>n=size<W,1>;D=zeros<1,n>;for i=1:n[P d]=n2short<W,k,i>;Pm{i}=P;D<i>=d;end程序五:pass2short.m<计算经过某两点的最短距离> function [P d]=pass2short<W,k1,k2,t1,t2>[p1 d1]=n2short<W,k1,t1>;[p2 d2]=n2short<W,t1,t2>;[p3 d3]=n2short<W,t2,k2>;dt1=d1+d2+d3;[p4 d4]=n2short<W,k1,t2>;[p5 d5]=n2short<W,t2,t1>;[p6 d6]=n2short<W,t1,k2>;dt2=d4+d5+d6;if dt1<dt2d=dt1;P=[p1 p2<2:length<p2>> p3<2:length<p3>>]; elsed=dt1;p=[p4 p5<2:length<p5>> p6<2:length<p6>>]; endP;d;第三讲:最小生成树程序一:最小生成树的Kruskal算法function [T c]=krusf<d,flag>if nargin==1n=size<d,2>;m=sum<sum<d~=0>>/2;b=zeros<3,m>;k=1;for i=1:nfor j=<i+1>:nif d<i,j>~=0b<1,k>=i;b<2,k>=j;b<3,k>=d<i,j>;k=k+1;endendendelseb=d;endn=max<max<b<1:2,:>>>;m=size<b,2>;[B,i]=sortrows<b',3>;B=B';c=0;T=[];k=1;t=1:n;for i=1:mif t<B<1,i>>~=t<B<2,i>>T<1:2,k>=B<1:2,i>;c=c+B<3,i>;k=k+1;tmin=min<t<B<1,i>>,t<B<2,i>>>; tmax=max<t<B<1,i>>,t<B<2,i>>>; for j=1:nif t<j>==tmaxt<j>=tmin;endendendif k==nbreak;endendT;c;程序二:最小生成树的Prim算法function [T c]=Primf<a>l=length<a>;a<a==0>=inf;k=1:l;listV<k>=0;listV<1>=1;e=1;while <e<l>min=inf;for i=1:lif listV<i>==1for j=1:lif listV<j>==0 & min>a<i,j>min=a<i,j>;b=a<i,j>;s=i;d=j;endendendendlistV<d>=1;distance<e>=b;source<e>=s;destination<e>=d;e=e+1;endT=[source;destination];for g=1:e-1c<g>=a<T<1,g>,T<2,g>>;endc;第四讲:Euler图和Hamilton图程序一:Fleury算法〔在一个Euler图中找出Euler环游〕注:包括三个文件;fleuf1.m, edf.m, flecvexf.mfunction [T c]=fleuf1<d>%注:必须保证是Euler环游,否则输出T=0,c=0n=length<d>;b=d;b<b==inf>=0;b<b~=0>=1;m=0;a=sum<b>;eds=sum<a>/2;ed=zeros<2,eds>;vexs=zeros<1,eds+1>;matr=b;for i=1:nif mod<a<i>,2>==1m=m+1;endendif m~=0fprintf<'there is not exit Euler path.\n'>T=0;c=0;endif m==0vet=1;flag=0;t1=find<matr<vet,:>==1>;for ii=1:length<t1>ed<:,1>=[vet,t1<ii>];vexs<1,1>=vet;vexs<1,2>=t1<ii>;matr<vexs<1,2>,vexs<1,1>>=0;flagg=1;tem=1;while flagg[flagg ed]=edf<matr,eds,vexs,ed,tem>;tem=tem+1;if ed<1,eds>~=0 & ed<2,eds>~=0T=ed;T<2,eds>=1;c=0;for g=1:edsc=c+d<T<1,g>,T<2,g>>;endflagg=0;break;endendendendfunction[flag ed]=edf<matr,eds,vexs,ed,tem>flag=1;for i=2:eds[dvex f]=flecvexf<matr,i,vexs,eds,ed,tem>;if f==1flag=0;break;endif dvex~=0ed<:,i>=[vexs<1,i> dvex];vexs<1,i+1>=dvex;matr<vexs<1,i+1>,vexs<1,i>>=0;elsebreak;endendfunction [dvex f]=flecvexf<matr,i,vexs,eds,ed,temp> f=0;edd=find<matr<vexs<1,i>,:>==1>;dvex=0;dvex1=[];ded=[];if length<edd>==1dvex=edd;elsedd=1;dd1=0;kkk=0;for kk=1:length<edd>m1=find<vexs==edd<kk>>;if sum<m1>==0dvex1<dd>=edd<kk>;dd=dd+1;dd1=1;elsekkk=kkk+1;endendif kkk==length<edd>tem=vexs<1,i>*ones<1,kkk>;edd1=[tem;edd];for l1=1:kkklt=0;ddd=1;for l2=1:edsif edd1<1:2,l1>==ed<1:2,l2>lt=lt+1;endendif lt==0ded<ddd>=edd<l1>;ddd=ddd+1;endendendif temp<=length<dvex1>dvex=dvex1<temp>;elseif temp>length<dvex1> & temp<=length<ded>dvex=ded<temp>;elsef=1;endend程序二:Hamilton改良圈算法〔找出比较好的Hamilton路〕function [C d1]= hamiltonglf<v>%d表示权值矩阵%C表示算法最终找到的Hamilton圈.%v =[ 51 67;37 84;41 94;2 99;18 54;4 50;24 42;25 38;13 40;7 64;22 60;25 62;18 40;41 26];n=size<v,1>;subplot<1,2,1>hold on;plot <v<:,1>,v<:,2>,'*'>; %描点for i=1:nstr1='V';str2=num2str<i>;dot=[str1,str2];text<v<i,1>-1,v<i,2>-2,dot>; %给点命名endplot <v<:,1>,v<:,2>>;%连线plot<[v<n,1>,v<1,1>],[v<n,2>,v<1,2>]>;for i =1:nfor j=1:nd<i,j>=sqrt<<v<i,1>-v<j,1>>^2+<v<i,2>-v<j,2>>^2>;endendd2=0;for i=1:nif i<nd2=d2+d<i,i+1>;elsed2=d2+d<n,1>;endendtext<10,30,num2str<d2>>;n=size<d,2>;C=[linspace<1,n,n> 1];for nnn=1:20C1=C;if n>3for m=4:n+1for i=1:<m-3>for j=<i+2>:<m-1>if<d<C<i>,C<j>>+d<C<i+1>,C<j+1>><d<C<i>,C<i+1>>+d<C<j>,C<j+1>>>C1<1:i>=C<1:i>;for k=<i+1>:jC1<k>=C<j+i+1-k>;endC1<<j+1>:m>=C<<j+1>:m>;endendendendelseif n<=3if n<=2fprint<'It does not exist Hamilton circle.'>; elsefprint<'Any cirlce is the right answer.'>;endendC=C1;d1=0;for i=1:nd1=d1+d<C<i>,C<i+1>>;endd1;endsubplot<1,2,2>;hold on;plot <v<:,1>,v<:,2>,'*'>; %描点for i=1:nstr1='V';str2=num2str<i>;dot=[str1,str2];text<v<i,1>-1,v<i,2>-2,dot>; %给点命名endv2=[v;v<1,1>,v<1,2>];plot<v<C<:>,1>,v<C<:>,2>,'r'>;text<10,30,num2str<d1>>;第五讲:匹配问题与算法程序一:较大基础匹配算法function J=matgraf<W>n=size<W,1>;J=zeros<n,n>;while sum<sum<W>>~=0a=find<W~=0>;t1=mod<a<1>,n>;if t1==0t1=n;endif a<1>/n>floor<a<1>/n>t2=floor<a<1>/n>+1;elset2=floor<a<1>/n>;endJ<t1,t2>=1,J<t2,t1>=1;W<t1,:>=0;W<t2,:>=0;W<:,t1>=0;W<:,t2>=0;endJ;程序二:匈牙利算法〔完美匹配算法,包括三个文件fc01,fc02,fc03〕function [e,s]=fc01<a,flag>if nargin==1flag=0;endb=a;if flag==0cmax=max<max<b>'>;b=cmax-b;endm=size<b>;for i =1:m<1>b<i,:>=b<i,:>-min<b<i,:>>;endfor j=1:m<2>b<:,j>=b<:,j>-min<b<:,j>>;endd=<b==0>;[e,total]=fc02<d>;while total~=m<1>b=fc03<b,e>;d=<b==0>;[e,total]=fc02<d>;endinx=sub2ind<size<a>,e<:,1>,e<:,2>>;e=[e,a<inx>];s=sum<a<inx>>;function [e,total]=fc02<d>total=0;m=size<d>;e=zeros<m<1>,2>;t=sum<sum<d>'>;nump=sum<d'>;while t~=0[s,inp]=sort<nump>;inq=find<s>;ep=inp<inq<1>>;inp=find<d<ep,:>>;numq=sum<d<:,inp>>;[s,inq]=sort<numq>;eq=inp<inq<1>>;total=total+1;e<total,:>=[ep,eq];inp=find<d<:,eq>>;nump<inp>=nump<inp>-1;nump<ep>=0;t=t-sum<d<ep,:>>-sum<d<:,eq>>+1;d<ep,:>=0*d<ep,:>;d<:,eq>=0*d<:,eq>;endfunction b=fc03<b,e>m=size<b>;t=1;p=ones<m<1>,1>;q=zeros<m<1>,1>;inp=find<e<:,1>~=0>;p<e<inp,1>>=0;while t~=0tp=sum<p+q>;inp=find<p==1>;n=size<inp>;for i=1:n<1>inq=find<b<inp<i>,:>==0>;q<inq>=1;endinp=find<q==1>;n=size<inp>;for i=1:n<1>if all<e<:,2>-inp<i>>==0inq=find<<e<:,2>-inp<i>>==0>;p<e<inq>>=1;endendtq=sum<p+q>;t=tq-tp;endinp=find<p==1>;inq=find<q==0>;cmin=min<min<b<inp,inq>>'>;inq=find<q==1>;b<inp,:>=b<inp,:>-cmin;b<:,inq>=b<:,inq>+cmin;第六讲:最大流最小费用问题程序一:2F算法<Ford-Fulkerson算法>,求最大流%C=[0 5 4 3 0 0 0 0;0 0 0 0 5 3 0 0;0 0 0 0 0 3 2 0;0 0 0 0 0 0 2 0; %0 0 0 0 0 0 0 4;0 0 0 0 0 0 0 3;0 0 0 0 0 0 0 5;0 0 0 0 0 0 0 0 ] function [f wf]=fulkersonf<C,f1>%C表示容量%f1表示当前流量,默认为0%f表示最大流±íʾ×î´óÁ÷%wf表示最大流的流量n=length<C>;if nargin==1;f=zeros<n,n>;elsef=f1;endNo=zeros<1,n>;d=zeros<1,n>;while <1>No<1>=n+1;d<1>=Inf;while <1>pd=1;for <i=1:n>if <No<i>>for <j=1:n>if <No<j>==0 & f<i,j><C<i,j>>No<j>=i;d<j>=C<i,j>-f<i,j>;pd=0;if <d<j>>d<i>>d<j>=d<i>;endelseif <No<j>==0 & f<j,i>>0>No<j>=-i;d<j>=f<j,i>;pd=0;if <d<j>>d<i>>d<j>=d<i>;endendendendendif <No<n>|pd>break;endendif <pd>break;enddvt=d<n>;t=n;while <1>if<No<t>>0>f<No<t>,t>=f<No<t>,t>+dvt;elseif <No<t><0>f<No<t>,t>=f<No<t>,t>-dvt;endif <No<t>==1>for <i=1:n>No<i>=0;d<i>=0;endbreakendt=No<t>;endendwf=0;for <j=1:n>wf=wf+f<1,j>;endf;wf;程序二:Busacker-Gowan算法<求最大流最小费用>%C=[0 15 16 0 0;0 0 0 13 14;0 11 0 17 0;0 0 0 0 8;0 0 0 0 0] %b=[0 4 1 0 0;0 0 0 6 1;0 2 0 3 0;0 0 0 0 2;0 0 0 0 0]%function [f wf zwf]=BGf<C,b>%C表示弧容量矩阵%b表示弧上单位流量的费用%f表示最大流最小费用矩阵%wf最大流量%zwf表示最小费用n=size<C,2>;wf=0;wf0=inf;f=zeros<n,n>;while <1>a=ones<n,n>*inf;for <i=1:n>a<i,i>=0;endfor <i=1:n>for <j=1:n>if<C<i,j>>0 & f<i,j>==0>a<i,j>=b<i,j>;elseif <C<i,j>>0 & f<i,j>==C<i,j>>a<j,i>=-b<i,j>;elseif <C<i,j>>0>a<i,j>=b<i,j>;a<j,i>=-b<i,j>;endendendfor <i=2:n>p<i>=inf;s<i>=i;endfor <k=1:n>pd=1;for <i=2:n>for <j=1:n>if <p<i>>p<j>+a<j,i>>p<i>=p<j>+a<j,i>;s<i>=j;pd=0; endendendif <pd>break;endendif <p<n>==inf>break;enddvt=inf;t=n;while <1>if <a<s<t>,t>>0>dvtt=C<s<t>,t>-f<s<t>,t>;elseif <a<s<t>,t><0>dvtt=f<t,s<t>>;endif <dvt>dvtt>dvt=dvtt;endif <s<t>==1>break;endt=s<t>;endpd=0;if <wf+dvt>=wf0>dvt=wf0-wf;pd=1;endt=n;while <1>if <a<s<t>,t>>0>f<s<t>,t>=f<s<t>,t>+dvt; elseif <a<s<t>,t><0>f<<t>,s<t>>=f<t,s<t>>-dvt; endif <s<t>==1>break;endt=s<t>;endif <pd>break;endwf=0;for <j=1:n>wf=wf+f<1,j>;endendzwf=0;for <i=1:n>for <j=1:n>zwf=zwf+b<i,j>*f<i,j>;endendf;。
matlab中gplot用法
一、介绍Matlab中gplot的基本概念Matlab是一种用于科学计算和数据分析的高级编程语言和交互式环境。
在Matlab中,gplot是一个用于绘制连接图的函数,它可以帮助用户在二维平面上绘制节点和边,并用于表示复杂的关系网络。
gplot函数可以用于可视化图论算法、网络分析、社交网络分析等领域,是Matlab中非常常用的函数之一。
二、gplot的基本语法在Matlab中,gplot函数的基本语法如下:gplot(A, xy)其中,A是一个邻接矩阵,表示图的连接关系;xy是节点的坐标,是一个二维矩阵,每一行包含了一个节点的x和y坐标。
使用这种语法,可以绘制由邻接矩阵A和节点坐标xy表示的图。
三、使用gplot绘制简单的连接图下面是一个使用gplot函数绘制简单连接图的例子:```matlabA = [0, 1, 0; 1, 0, 1; 0, 1, 0]; % 邻接矩阵xy = [1, 1; 2, 2; 3, 1]; % 节点坐标gplot(A, xy, '-o') % 绘制连接图```在这个例子中,邻接矩阵A表示了一个三个节点的连接关系,节点坐标xy表示了每个节点在二维平面上的位置。
使用gplot函数绘制出的连接图如下:(此处应包含一张通过gplot函数绘制的简单连接图的图片)四、gplot函数的一些高级用法除了基本的用法外,gplot函数还支持一些高级的功能,比如绘制加权图、自定义节点和边的颜色等。
下面是一个使用gplot函数绘制加权连接图的例子:```matlabA = [0, 3, 0; 3, 0, 2; 0, 2, 0]; % 邻接矩阵xy = [1, 1; 2, 2; 3, 1]; % 节点坐标C = [1, 0, 0; 0, 1, 0; 0, 0, 1]; % 边的权重gplot(A, xy, '-o', 'EdgeColor', C) % 绘制加权连接图```在这个例子中,邻接矩阵A表示了一个加权连接图的连接关系,节点坐标xy表示了每个节点在二维平面上的位置,边的权重C表示了每条边的权重。
Matlab中的图像拼接与矩阵计算技术详解
Matlab中的图像拼接与矩阵计算技术详解Matlab是一款用于数值计算和可视化的软件。
在图像处理领域,Matlab提供了丰富的函数和工具箱,其中包括图像拼接和矩阵计算技术。
本文将详细介绍Matlab中的图像拼接与矩阵计算技术,并探讨其在实际应用中的作用和优势。
一、图像拼接技术的基本原理图像拼接是将多张图像合并成一张大图的技术。
在Matlab中,图像拼接主要通过矩阵计算来实现。
首先,需要将每张图像转换为矩阵的形式,然后对这些矩阵进行相应的运算,最后再将运算结果转换为图像的形式。
图像拼接的基本原理包括以下几个步骤:1. 加载图像:在Matlab中,可以使用imread函数加载图像。
通过指定图像的文件路径,可以将图像读取为一个矩阵。
2. 处理图像:在进行图像拼接之前,通常需要对图像进行一些预处理操作,例如调整图像的大小、裁剪、旋转等。
Matlab提供了一系列函数和工具箱来进行图像处理,可以根据实际需求选择合适的方法。
3. 图像对齐:在将多张图像拼接成一张大图之前,需要确保它们在空间上对齐。
通常情况下,图像对齐可以通过特征点匹配来实现。
Matlab中的图像拼接工具箱提供了多种特征点匹配算法,例如SIFT、SURF等。
4. 图像拼接:一旦完成了图像对齐,就可以开始进行图像拼接了。
在Matlab中,可以使用矩阵计算技术来对图像进行拼接。
具体来说,可以将多个图像的矩阵按照一定的规则进行组合,然后通过矩阵运算来生成新的矩阵,最后再将新的矩阵转换为图像。
二、矩阵计算技术在图像拼接中的应用在Matlab中,矩阵计算技术在图像拼接中发挥着重要的作用。
通过矩阵计算,可以对图像进行精确的位置调整、旋转、缩放等操作,在保证图像对齐的同时,还能保持图像的质量和清晰度。
1. 位置调整:通过对图像进行平移操作,可以将它们对齐在同一个平面上。
在Matlab中,可以使用矩阵加法来实现图像的平移,即将图像的矩阵与一个平移矩阵相加,从而改变图像的位置。
利用matlab绘制矩阵色块图.
R语言中有一个根据实值矩阵绘制色块图的程序(用于绘制相关系数矩阵图),可以用丰富的颜色和形状形象的展示矩阵元素值的大小。
遗憾的是MATLAB中没有这样的函数,因此我就用MATLAB编写了一个matrixplot函数,下面给出示例和源码,与大家一起分享!**********************************************【例1】绘制网格线,网格中显示矩阵元素。
显示黑色文字:>> x = [1,-0.2,0.3,0.8,-0.5-0.2,1,0.6,-0.7,0.20.3,0.6,1,0.5,-0.30.8,-0.7,0.5,1,0.7-0.5,0.2,-0.3,0.7,1];>> XVarNames = {'xiezhh','heping','keda','tust','tianjin'};>>matrixplot(x,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames',XVarNam es);效果图1:根据矩阵元素值自动设置文字颜色:>>matrixplot(x,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames',XVarNam es,'TextColor','Auto','ColorBar','on');【例2】绘制实值矩阵各元素对应的色块,通过不同的“参数/参数值”控制色块的形状、大小、颜色等属性。
方形色块,充满方格,灰白色字体>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'TextColor',[0. 6,0.6,0.6],'ColorBar','on');效果图3:方形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','o ff','FigSize','Auto','ColorBar','on');椭圆形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','o ff','FigSize','Auto','ColorBar','on','FigShape','e');效果图5:圆形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体,上三角形式显示>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','o ff','FigSize','Auto','ColorBar','on','FigShape','c','FigStyle','Triu');六边形色块,根据矩阵元素值自动确定色块的大小和颜色,显示字体,下三角形式显示>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','o n','FigSize','Auto','ColorBar','on','FigShape','h','FigStyle','Tril');效果图7:表盘形色块,根据矩阵元素值自动确定色块的颜色,不显示字体>>matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','o ff','FigSize','Full','ColorBar','on','FigShape','d');【例3】读取真彩图片,绘制伪红外图。
matlab图论方法
哈密顿圈(环球旅行游戏)
问题3(四色问题): 对任何一张地图进行着色,两个共同边界的
国家染不同的颜色,则只需要四种颜色就够了.
问题4(关键路径问题): 一项工程任务,大到建造一座大坝,一座体育
中心,小至组装一台机床,一架电视机, 都要包括 许多工序.这些工序相互约束,只有在某些工序完 成之后, 一个工序才能开始. 即它们之间存在完 成的先后次序关系,一般认为这些关系是预知的, 而且也能够预计完成每个工序所需要的时间.
V = {v1 , v2 , v3 , v4}, E = { v1v2 , v1v3 , v1v4 , v2v3 , v2v4 , v3v4}.
今后将不计较这种外形上的差别,而用一个容 易理解的、确定的图解去表示一个图.
有边联结的两个点称为相邻的点, 有一个公共 端点的边称为相邻边. 边和它的端点称为互相关联. 常用d(v)表示图G中与顶点v关联的边的数目, d(v) 称为顶点v的度数. 用N(v)表示图G中所有与顶点v相 邻的顶点的集合.
这时工程领导人员迫切希望了解最少需要多 少时间才能够完成整个工程项目, 影响工程进度 的要害工序是哪几个?
6.1 图论的基本概念
图论中的“图”并不是通常意义下的几何图 形或物体的形状图, 而是以一种抽象的形式来表 达一些确定的事物之间的联系的一个数学系统.
定义1 一个有序二元组(V, E ) 称为一个图, 记 为G = (V, E ), 其中
(0,1,0,1) (0,1,0,0) (0,0,1,0) (0,0,0,1) (0,0,0,0) (1,0,1,0) (1,0,1,1) (1,1,0,1) (1,1,1,0) (1,1,1,1)
MATLAB编程:最短路问题
z 则 令 l(v ) = l(u ) W (u , v ) , (v ) = u
( 3) 设 v 是 使 l(v ) 取 最 小 值 的 S
定 义 3 ( 1 ) 设 P (u ,v)是 赋 权 图 G 中 从 u 到 v 的 路 径 , 则 称 w(P)
e E ( P )
w (e) 为 路 径
P 的权.
(2 )
在赋权图 G 中,从顶点 u 到顶点 v 的具有最小权的路
P (u , v ) , 称 为 u 到 v 的 最 短 路 .
u2
u 6
6
u5
图 G 的 边 为 边 集 的 图 G 的 子 图 , 称 为 G 的 由 V 1 导 出 的 子 图 , 记 为 G[V 1 ]. (3)设 E 1 E ,且 E 1 ,以 E 1 为 边 集 ,E 1 的 端 点 集 为 顶 点 集 的 图 G 的 子 图 , 称 为 G 的 由 E 1 导 出 的 子 图 ,记 为 G[E 1 ].
返回
邻接矩阵
对 无 向 图 G , 其 邻 接 矩 阵 A ( a ij ) , 其 中 :
a ij
1 0
若 v i 与 v j 相邻 若 v i 与 v j 不相邻
v1 A= 0 1 0 1 v2 1 0 1 1 0 1 0 1
注:假设图为简单图
返回
顶点的次数
定义 (1)在无向图中,与顶点 v 关联的边的 数目(环 算两次) 称 为 v 的 次 数 , 记 为 d (v). (2)在有向图中,从顶点 v 引出的边的数目称为 v 的出度, 记 为 d + ( v), 从 顶 点 v 引 入 的 边 的 数 目 称 为 的 入 度 , 记 为 d - (v), d ( v)= d + ( v)+ d - ( v) 称 为 v 的 次 数 .
生成有向带权邻接矩阵 matlab
生成有向带权邻接矩阵 matlab生成有向带权邻接矩阵是一个常见的问题,特别是在图论和网络分析领域。
Matlab是一种十分强大的计算工具,可以用它来生成邻接矩阵。
下面将介绍如何使用Matlab生成有向带权邻接矩阵。
1. 创建一个随机图首先,我们需要创建一个随机图。
可以使用Matlab自带的函数“rand”来创建一个随机矩阵。
例如,下面的代码可以创建一个5x5的随机矩阵:```A = rand(5);```2. 将矩阵转换为有向带权邻接矩阵接下来,我们需要将这个随机矩阵转换为有向带权邻接矩阵。
我们可以使用Matlab自带的函数“triu”来提取上三角部分,并使用“tril”函数提取下三角部分。
然后将它们相加即可得到完整的邻接矩阵。
例如,下面的代码可以将上三角部分和下三角部分相加,并得到完整的邻接矩阵:```B = triu(A) + tril(A)';```3. 将非零元素设为权重现在我们已经得到了一个有向无权邻接矩阵。
如果我们想要得到一个有向带权邻接矩阵,我们需要将非零元素设为权重。
可以使用Matlab 自带的函数“find”来找到非零元素的位置,并使用“sub2ind”函数将它们转换为线性索引。
然后可以使用“randi”函数生成随机的权重。
例如,下面的代码可以将非零元素设为随机权重:```[i,j] = find(B);idx = sub2ind(size(B), i, j);weights = randi([1,10], size(idx));B(idx) = weights;```4. 完整代码最后,我们可以将上面的步骤合并到一个完整的Matlab函数中。
下面是一个示例代码:```function [B] = generate_weighted_adjacency_matrix(n)% n: 节点数% B: 有向带权邻接矩阵A = rand(n);B = triu(A) + tril(A)';[i,j] = find(B);idx = sub2ind(size(B), i, j);weights = randi([1,10], size(idx));B(idx) = weights;end```这个函数接受一个参数n,表示节点数,并返回一个有向带权邻接矩阵。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
matlab 根据邻接矩阵作图
Matlab中根据邻接矩阵做图
function tu_plot(rel,control) %由邻接矩阵画图
%输入为邻接矩阵,必须为方阵;
%第二个输入为控制量,0表示无向图,1表示有向图。
默认值为0
r_size=size(rel);
if nargin<2
control=0;
end
if r_size(1)~=r_size(2)
disp('Wrong Input! The input must be a square matrix!');
return;
end
len=r_size(1);
rho=10;%限制图尺寸的大小
r=2/1.05^len;%点的半径
theta=0:(2*pi/len):2*pi*(1-1/len);
[pointx,pointy]=pol2cart(theta',rho); theta=0:pi/36:2*pi;
[tempx,tempy]=pol2cart(theta',r); point=[pointx,pointy];
hold on
for i=1:len
temp=[tempx,tempy]+[point(i,1)*ones(length(tempx),1),point(i,2)*ones (le
ngth(tempx),1)];
plot(temp(:,1),temp(:,2),'r');
text(point(i,1)-0.3,point(i,2),num2str(i));
%画点
end
for i=1:len
for j=1:len
if rel(i,j)
link_plot(point(i,:),point(j,:),r,control);
%连接有关系的点
end
end
end
set(gca,'XLim',[-rho-r,rho+r],'YLim',[-rho-r,rho+r]); axis off
%%
function link_plot(point1,point2,r,control)
%连接两点
temp=point2-point1;
if (~temp(1))&&(~temp(2))
return;
%不画子回路;
end
theta=cart2pol(temp(1),temp(2));
[point1_x,point1_y]=pol2cart(theta,r);
point_1=[point1_x,point1_y]+point1;
[point2_x,point2_y]=pol2cart(theta+(2*(theta<pi)-1)*pi,r);
point_2=[point2_x,point2_y]+point2;
if control
arrow(point_1,point_2); else
plot([point_1(1),point_2(1)],[point_1(2),point_2(2)]);
end
%%
function arrow(start,stop,l) %start,stop分别为起点和终点
%l为箭头的线长度,默认为主线长的1/10
t=0.1;
ang=15/180*pi;
temp=stop(1)-start(1)+j*(stop(2)-start(2));
L=abs(temp);P=angle(temp);
if nargin<3
l=t*L;
end
p1=P-ang;p2=P+ang;
a=[stop(1)-l*cos(p1) stop(2)-l*sin(p1)]; b=[stop(1)-l*cos(p2) stop(2)-l*sin(p2)]; hold on
plot([start(1) stop(1)],[start(2) stop(2)]); plot([a(1)
stop(1)],[a(2) stop(2)]); plot([b(1) stop(1)],[b(2) stop(2)]); end
效果图如下:
邻接矩阵为
0 1 0 0 0 0
0 0 0 0 0 1
1 0 0 0 0 1
0 0 1 1 0 1
0 1 0 0 0 1
1 0 0 0 1 0 的有向图:
小程序,小兴趣。
欢迎加入编程爱好者群(69321895)一起成长。