2017-05-27 28 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循環的地方(但你還需要提供圖的數據集) –