首页 > 解决方案 > matlab - 从邻接中查找路径数组的循环太多

问题描述

就像标题所说的那样,我想让代码更快更容易阅读。

我有一个邻接矩阵:

Ad=[  0   1   0   0   1   0   0   0   0   0;
      1   0   0   0   0   0   0   0   0   0;
      1   0   0   1   1   0   0   0   0   0;
      0   0   1   0   0   1   0   0   0   0;
      1   0   1   0   0   1   0   0   0   0;
      0   0   0   1   1   0   0   0   0   0;
      0   0   0   0   0   0   0   1   1   0;
      0   0   0   0   0   0   1   0   0   1;
      0   0   0   0   0   0   1   0   0   1;
      0   0   0   0   0   0   0   1   1   0];

我将用Name={'a';'b';'c';'d';'E';'F';'a';'E';'d';'F'};它来描述一种“行星”。

从已删除问题的过去评论中找出一些新词后,我可以想出一个开始:

dig=digraph(Ad, Name);
[Num.Nodes,Num.Null]=size(dig.Nodes);
for j2=1:Num.Nodes
 dfs{j2}=dfsearch(dig,(j2),'allevents');
 Num.node2path=dfs{j2}.Node;
 Num.tokeep = ~isnan(Num.node2path);
 Num.node2path = Num.node2path(Num.tokeep);
 Num.node2path(1)=[];
 [Num.node2path2,Num.Null]=size(Num.node2path);
  for i2=1:Num.node2path2-1
   if Num.node2path(i2)==Num.node2path(i2+1)
   path{j2,i2}=Num.node2path(1:i2);Num.node2path(i2)=1000;Num.node2path(i2+1)=1001;
    if Num.node2path(i2-1)==Num.node2path(i2+2)
    Num.node2path(i2-1)=1002;Num.node2path(i2+2)=1003;
    end
   end
  end
 end
path = path(~cellfun('isempty',path));
[Num.clear1000,Num.degeaba] = size(path);
for i3=1:Num.clear1000
 Num.is1000 = find(path{i3}(:) == 1000);
 path{i3}(Num.is1000)=[];
 Num.is1000 = find(path{i3}(:) == 1001);
 path{i3}(Num.is1000)=[];
 Num.is1000 = find(path{i3}(:) == 1002);
 path{i3}(Num.is1000)=[];
 Num.is1000 = find(path{i3}(:) == 1003);
 path{i3}(Num.is1000)=[];
 end

问题是我觉得循环太多太复杂了,我什至没有得到我想要的结果。例如,'2' 和 '6' 之间的路径将是[2;1;5;3;4;6]并且可以通过更多的循环来寻找path{i4}(1);等于 2 和path{i4}(end);等于 6,i4 是 10。

因此,在找到所有路径后,我想使用 重命名路径Name,因为我将相同的名称分配给相同类型的“行星”。接下来我会选择通往“最佳星球”的最短路径。

现在形式为[a;E;d]的路径与Ad2和的路径进行比较Name2。如果从第一个“行星”到最后一个“行星”的距离相似,则将保存并比较具有相同名称的路径,就像开始搜索的路径一样。我引用“行星”是因为它们可能是恒星、小行星,甚至这些都是分类的,所以这就是Name它的来源。

标签: matlabadjacency-matrix

解决方案


推荐阅读