Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何使用循环标记图形边?_Matlab_Plot_Graph_Matlab Figure - Fatal编程技术网

Matlab 如何使用循环标记图形边?

Matlab 如何使用循环标记图形边?,matlab,plot,graph,matlab-figure,Matlab,Plot,Graph,Matlab Figure,我正在使用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;

我正在使用
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
每次在新的绘图中,我只能看到最新的标签簇,而旧标签则消失了。理想情况下,我希望
保持
labeledge
的结果,但是
保持
不能这样做。我需要在循环的每个步骤中显示标签,因此添加另一个整体
labeledge
不是我理想的解决方案。任何暗示都将不胜感激


编辑:所有我的变量都是单元格数组中大小不同的多个单元格。我使用
for
循环来帮助从单元格中提取向量,因为我不知道如何将这些单元格数组中的所有级别的信息插入
addNode
函数

尝试删除“图;”命令退出FOR循环,并尝试查看此操作是否有效。

代码中的主要问题是您一次又一次地绘制图形。这是没有必要的。相反,使用一个循环来创建图形对象(
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
如果您希望在每次迭代时绘制图形,可以使用
子图

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

我确实得到了更多的标签,但不是所有的(很奇怪,我正试图找出原因)。但是,如果没有“figure”,我无法在循环过程中获得绘图。在进入FOR循环之前,请删除它并放置“figure”。此外,正如EBH所要求的,请尝试不要将FOR与所有节点一起使用。你可以创建一个节点向量,把它们放在没有FOR循环的地方(但你也需要提供绘图的数据集)。我会尝试遍历所有单元格,挑选出要绘图的相关数据(节点编号、链接到的下一个节点编号、边线长度等)并将其放在带有适当标签的表格中-此后处理任务将有助于以后在一个绘图处绘制。在这个阶段,我会在某个分支上从“叶子”的开始运行到结束,然后迭代到另一个分支,并一次又一次地这样做,直到所有叶子都出现在绘图上。也许这会帮助你:[link]()为什么你要使用
for
循环并将所有节点添加到一起?我正在构建一个像树一样的网络。每个节点都有自己的分支和叶子(新节点)。FOR循环帮助我将树抬高并长出更多的叶子。为什么您首先在中为
H
分配一个新节点:
H=addnode(P,nodeName{r}{j})
然后用:
P=addedge(H,s{r}{j},t{r}{j},w{r}{j})将其分配回
P
?另外,我认为您的节点名部分被这个过程覆盖了。您可以添加边列表,也可以添加具有节点名称的邻接矩阵。@EBH邻接矩阵似乎可行。在这个过程中,我确实有重复的节点名称,我将在矩阵中反映重复。非常感谢你的想法!一旦成功,我会和你一起更新。您可以使用,而不仅仅是矩阵。2.您可以用上面的代码在ND数组中表示一个多级单元数组,只要它的所有分支具有相同的形状。@YolandaWang太棒了!将绘图保持在循环中会得到什么?循环中的图形用于测试网络是否正常工作。否则,我将失去最终图形的解释,因为它太复杂,无法解释read@YolandaWang我在答案中添加了另一部分,用于在循环中绘制一个不断增长的图形。
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