Я использую цикл 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 получить результаты labeledge, но hold on не может этого сделать. Мне нужно показывать метки на каждом шаге в цикле, поэтому добавление еще одного labeledge не является моим идеальным решением. Любая подсказка будет оценена.

Правка . Все мои переменные представляют собой несколько ячеек разного размера в массивах ячеек. Я использую цикл for, чтобы помочь выбрать векторы из ячеек, потому что я не знаю, как вставить все уровни информации из таких массивов ячеек и т. Д. В функцию addNode.

1
Yolanda Wang 27 Май 2017 в 22:26

2 ответа

Лучший ответ

Основная проблема в вашем коде заключается в том, что вы продолжаете строить график снова и снова. Это не обязательно. Вместо этого используйте один цикл для создания объекта графа (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

Кроме того, вы должны это знать ( из документации Matlab ) :

Для лучшей производительности строите графики одновременно, используя один вызов графика. Добавление узлов или ребер в цикле может быть медленным для больших графов.

Кроме того, независимо от приведенной выше рекомендации, для облегчения манипулирования вашими данными вы должны сначала преобразовать свои ячейки в массив. Если ваш массив ячеек содержит различное количество элементов в каждой ячейке, то лучше свернуть все это в один столбец:

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
1
EBH 5 Июн 2017 в 18:59

Попробуйте убрать «фигуру»; выйдите из цикла FOR и попробуйте посмотреть, сработало ли это.

0
Itzik Chaimov 27 Май 2017 в 19:30