2017-05-27 64 views
1

我正在使用for循环在我的图上添加更多节点和边。但是,当我在新边缘添加标签时,旧标签将被删除。我不知道如何保留旧的标签,也不知道如何存储labeledge的结果。如何用循环标记图形边缘?

这就是我到目前为止所得到的。

for r = 1: 10 
    for j = 1:10 
     H = addnode(P,nodeName{r}{j}); 
     P = addedge(H, s{r}{j}, t{r}{j}, w{r}{j}); 
     figure; 
     hold on; 
     h = plot(P); 
     labeledge(h,s{r}{j},t{r}{j},labelText{r}{j}) 
    end 
end 

每次在新的情节,我只能看到最新的标签集群,而旧的标签不见了。理想情况下,我很乐意hold on的结果labeledgehold on不能做到这一点。我需要在循环中的每个步骤中显示标签,因此添加另一个整体labeledge不是我的理想解决方案。任何暗示将不胜感激。

编辑:我所有的变量都是单元格数组中不同大小的多个单元格。我使用for循环来帮助从细胞中获取载体,因为我不知道如何从细胞等细胞阵列中插入所有信息级别到addNode函数。

+0

你为什么要使用'for'循环,将所有的节点连接在一起? – EBH

+0

我正在构建一个像树一样的网络。每个节点都有自己的分支和叶子(新节点)。 FOR循环帮助我培养树并生长更多的树叶。 –

+1

为什么首先在'H = addnode(P,nodeName {r} {j});'中为'H'分配一个新节点,然后用'P = s {r} {j},t {r} {j},w {r} {j});'?另外,我认为你的节点名称在这个过程中会受到一些限制。你应该添加一个边缘列表,添加一个邻接矩阵和节点名称。 – EBH

回答

1

您代码中的主要问题是您不断绘制图形。这不是必需的。相反,使用一个循环来创建图形对象(G),然后绘制它一下子,然后用另一个循环用于标记图:

P = graph; 
for r = 1: 10 
    for j = 1:10 
     P = addedge(P, s{r}{j}, t{r}{j}, w{r}{j}); 
    end 
end 
h = plot(P); 
for r = 1: 10 
    for j = 1:10 
     labeledge(h,s{r}{j},t{r}{j},labelText{r}{j}) 
    end 
end 

如果你想绘制在每个迭代上的图形,你可以使用subgraph为:

for k = 1:height(P.Nodes) 
    H = subgraph(P,1:k); 
    figure; 
    h = plot(H); 
    c = 1; 
    out = false; 
    for r = 1: 10 
     if ~out 
      for j = 1:10 
       if c < k 
        labeledge(h,c,labelText{r}{j}) 
       else 
        out = true; 
        break 
       end 
       c = c+1; 
      end 
     else 
      break 
     end 
    end 
end 

除此之外,你应该知道,(from Matlab documentation):

为了获得最佳性能,请使用单个调用来一次构建图形。对于大图,在循环中添加节点或边可能会很慢。

另外,无论上述建议如何,为了更轻松地操作数据,您应该先将单元格转换为数组。如果您的单元阵列包含在每个小区不同数量的元素,那么最好是将其全部关闭一列:

C = [s{:}]; % and the same for t and w 
while any(cellfun(@iscell,C)) 
    C = vertcat(C{:}); 
end 
C = cellfun(@(x) x(:),C,'UniformOutput', false); 
S = vertcat(C{:}); 

Labels = [labelText{:}]; % and the same nodeName 
while any(cellfun(@iscell,Labels)) 
    Labels = vertcat(Labels{:}); 
end 
+0

1.您可以使用[ND-array](http:// www .mathworks.com/help/matlab/math/multidimensional-arrays.html),不仅是一个矩阵。 2.您可以使用上面的代码在ND阵列中表示一个多层单元阵列,只要它的所有分支具有相同的形状即可。 – EBH

+0

@YolandaWang太棒了!通过保持循环内的阴谋你会得到什么? – EBH

+0

循环中的图形用于测试网络是否正常工作。否则,我将失去对最终图的解释,因为它太复杂了。 –

0

尝试删除'图形'命令退出FOR循环并尝试查看这是否工作。

+0

我确实得到了更多的标签,但不是全部(很奇怪,我试图弄清楚为什么)。然而,没有“数字”,我无法在循环过程中获得阴谋。 –

+0

删除它并在进入FOR循环之前放置'figure'。 –

+0

另外,正如EBH问你的,尽量不要一起使用FOR,一起添加所有节点。你可以创建一个Vector节点,并把它们放在没有FOR循环的地方(但你还需要提供图的数据集) –