MATLAB读取csv文件显示有向/无向图和目标路径——用于路径搜索算法的展示
在我的上一篇博文按要求自动生成无向/有向图(基于C++实现)中,已经生成了我需要的图,接下来我准备编码实现各种路径搜索算法,但在此之前,我需要能够有效的展示(即绘制)我生成的图以及最终求得的目标路径,在研究之后,一开始是准备用Python调用c++代码的方式来显示图和路径,但是这种方法比较难,我暂时未弄清楚,因此退而求简单的方法,首先用VS编辑c++代码产生图和路径,然后将图和路径存储在csv文件中,最后利用MATLAB来读取文件获得图和路径并绘制。
c++生成有向/无向图以及路径
具体生成图的方法以及代码可以参考博文按要求自动生成无向/有向图(基于C++实现),在生成图信息之后,直接将邻接矩阵存储到csv文件中,具体代码如下:
void Graph::printToCSV()
{
FILE* fd = NULL;
if ((fd = fopen("map.csv", "wt+")) != NULL)
{
//存储基本信息
fprintf(fd, "%s,%s,%s\n", "type 1:no-directed 2:directed", "Node_counts", "Edge_counts");
fprintf(fd, "%d,%d,%d\n",type,Node_counts,Edge_counts);
//存储节点信息
for (int i = 0; i < Node_counts; i++)
{
for (int j = 0; j < Node_counts; j++)
{
if (Map[i][j] >= MaxLen)
fprintf(fd, "%3.2f,", 0);
else
fprintf(fd, "%3.2f,", Map[i][j]);
}
fprintf(fd, "\n");
}
}
fclose(fd);
fd = NULL;
}
map.csv文件存储图的邻接矩阵,其内容举例如下:
path.csv文件存储路径的节点序列,只有一行,其内容举例如下:
MATLAB代码
参考了两篇文章:
1、【Matlab学习手记】绘制带箭头直线
2、matlab练习程序(矩阵生成无向网络图) - Dsp Tian - 博客园
代码如下:
%% 显示有向图、无向图以及路径
function ShowGraphFormCsv(graph_file_addr,path_file_addr)
%graph_file_addr 图信息文件地址 如:'C:\Users\YW\source\repos\Create_random_graph\Create_random_graph\map.csv'
%path_file_addr 目标路径文件地址 如:'C:\Users\YW\source\repos\Create_random_graph\Create_random_graph\path.csv'
%判断参数多少
switch nargin
case 1
show_path = 0;
case 2
show_path =1;
end
%不显示路径
if(show_path~=1)
%1、获取数据
%graph返回的是文件中的图信息,txt输出的是文本内容,raw输出的是未处理数据
[graph,txt1,raw1]=xlsread(graph_file_addr) ;
%path返回的是文件中的路径,txt输出的是文本内容,raw输出的是未处理数据
%p[path,txt2,raw2]=xlsread(path_file_addr) ;
%获取图的基本信息
Graph_type=graph(1,1);%//类型 1-无向图 2-有向图
Node_counts=graph(1,2);