упрощение

Уменьшайте мультиграф до простого графика

Синтаксис

H = simplify(G)
H = simplify(G,pickmethod)
H = simplify(G,aggregatemethod)
H = simplify(___,selfloopflag)
H = simplify(___,Name,Value)
[H,eind,ecount] = simplify(___)

Описание

пример

H = simplify(G) возвращает график без нескольких ребер или самоциклов. Когда несколько ребер происходят между теми же двумя узлами, только первое ребро (как задано в G.Edges) сохранено. Свойства ребра сохраняются.

пример

H = simplify(G,pickmethod) задает метод, чтобы выбрать между несколькими ребрами. Свойства ребра сохраняются. pickmethod может быть 'first' (значение по умолчанию), 'last', 'min' или 'max'.

пример

H = simplify(G,aggregatemethod) задает метод, чтобы объединить вес ребра нескольких ребер в вес одного нового ребра. Все другие свойства ребра в G пропущены. aggregatemethod может быть 'sum' или 'mean'.

пример

H = simplify(___,selfloopflag) задает, сохранить ли или удалить самоциклы из графика с помощью какой-либо из комбинаций входных аргументов в предыдущих синтаксисах. Например, 'keepselfloops' указывает, что узлы с одним или несколькими самоциклами будут иметь один самоцикл в упрощенном графике.

H = simplify(___,Name,Value) задает дополнительные опции с одним или несколькими аргументами пары "имя-значение". Например, можно задать 'PickVariable' и переменную в G.Edges, чтобы использовать ту переменную с методами выбора 'max' или 'min'.

пример

[H,eind,ecount] = simplify(___) дополнительно возвращает индексы ребра, eind и ребро считают ecount:

  • H.Edges(eind(i),:) является ребром в H, который представляет ребро i в G.

  • ecount(j) является количеством ребер в G, которые соответствуют ребру j в H.

Примеры

свернуть все

Создайте взвешенный, неориентированный мультиграф с несколькими ребрами между узлом 1 и узлом 2.

G = graph([1 1 1 1 2 3],[2 2 2 3 3 4], 1:6);
G.Edges
ans=6×2 table
    EndNodes    Weight
    ________    ______

     1    2       1   
     1    2       2   
     1    2       3   
     1    3       4   
     2    3       5   
     3    4       6   

Упростите мультиграф в простой график, такой, что существует только одно ребро между узлом 1 и узлом 2. simplify сохраняет первое ребро между теми двумя узлами, G.Edges(1,:), и пропускает другие.

G = simplify(G);
G.Edges
ans=4×2 table
    EndNodes    Weight
    ________    ______

     1    2       1   
     1    3       4   
     2    3       5   
     3    4       6   

Используйте второй вход simplify, чтобы выбрать метод, который выбирает между несколькими ребрами или комбинирует несколько ребер в одно.

Создайте взвешенный мультиграф. В этом графике пять ребер происходят между узлом 3 и узлом 4, но ребра имеют случайные веса. Просмотрите таблицу ребер и постройте график для ссылки.

G = graph([1 2 3 3 3 3 3 3 ],[2 3 1 4 4 4 4 4],randi(10,1,8));
G.Edges
ans=8×2 table
    EndNodes    Weight
    ________    ______

     1    2        9  
     1    3        2  
     2    3       10  
     3    4       10  
     3    4        7  
     3    4        1  
     3    4        3  
     3    4        6  

plot(G,'EdgeLabel',G.Edges.Weight)

Команда simplify(G) сохраняет первое из повторных ребер. Однако можно задать различный метод выбора/объединения со вторым входом.

Опции для выбора между несколькими ребрами: 'first' (значение по умолчанию), 'last', 'min' и 'max'. Сохраните повторное ребро с максимальным весом.

H_pick = simplify(G,'max');
plot(H_pick,'EdgeLabel',H_pick.Edges.Weight)

Опции для объединения нескольких ребер в каждый: 'sum' и 'mean'. Суммируйте повторенные ребра вместе, чтобы произвести одно ребро с большим весом.

H_comb = simplify(G,'sum');
plot(H_comb,'EdgeLabel',H_comb.Edges.Weight)

Упростите график при сохранении самоциклов с помощью опции 'keepselfloops'.

Создайте мультиграф с двумя узлами и несколькими самоциклами. Упростите график и сохраните самоциклы.

G = graph([1 1 1 1 1 1 1 2 2 2 2],[1 1 1 1 2 2 2 2 2 2 2 ]);
plot(G)
axis equal

G = simplify(G,'keepselfloops');
plot(G)
axis equal

Используйте второе и треть выходные параметры simplify, чтобы получить информацию о том, сколько (и который) объединены ребра.

Создайте неориентированный мультиграф с тремя узлами и четырьмя ребрами.

G = graph([1 1 1 2],[2 2 3 3]);
G.Edges
ans=4×1 table
    EndNodes
    ________

     1    2 
     1    2 
     1    3 
     2    3 

Упростите график и задайте три выходных параметров, чтобы получить дополнительную информацию об объединенных ребрах.

[G,ei,ec] = simplify(G)
G = 
  graph with properties:

    Edges: [3x1 table]
    Nodes: [3x0 table]

ei = 4×1

     1
     1
     2
     3

ec = 3×1

     2
     1
     1

ei(i) является ребром в упрощенном графике, который представляет ребро i в старом графике. Поскольку первые два ребра повторяются, ei(1) = ei(2) = 1. Кроме того, ec(1) = 2, с тех пор существует два ребра в новом графике, соответствующем ребру 1 в старом графике.

Покажите, как упростить мультиграф с помощью пар "имя-значение" 'AggregationVariables' и 'PickVariable'.

Создайте мультиграф, где узлы представляют местоположения, и ребра представляют виды транспорта. Ребра имеют свойства, которые отражают стоимость и время каждого режима транспортировки. Предварительно просмотрите таблицу ребер.

G = graph([1 1 1 1 1 1 2 2 2],[2 2 2 3 3 3 3 3 3],[],{'New York', 'Boston', 'Washington D.C.'});
G.Edges.Mode = categorical([1 2 3 1 2 3 1 2 3],[1 2 3],{'Air' 'Train' 'Bus'})';
G.Edges.Cost = [400 80 40 250 100 75 325 150 100]';
G.Edges.Time = [1 7 5 1.5 10 8 1.75 11 9]';
G.Edges
ans=9×4 table
               EndNodes                Mode     Cost    Time
    _______________________________    _____    ____    ____

    'New York'    'Boston'             Air      400        1
    'New York'    'Boston'             Train     80        7
    'New York'    'Boston'             Bus       40        5
    'New York'    'Washington D.C.'    Air      250      1.5
    'New York'    'Washington D.C.'    Train    100       10
    'New York'    'Washington D.C.'    Bus       75        8
    'Boston'      'Washington D.C.'    Air      325     1.75
    'Boston'      'Washington D.C.'    Train    150       11
    'Boston'      'Washington D.C.'    Bus      100        9

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

plot(G,'EdgeLabel',cellstr(G.Edges.Mode),'LineWidth',G.Edges.Time./min(G.Edges.Time),'EdgeCData',G.Edges.Cost)
colorbar

Используйте метод выбора 'min' и задайте значение 'PickVariable' как переменная 'Time', чтобы найти самый быстрый вид транспорта между каждым набором узлов.

t = simplify(G,'min','PickVariable','Time');
plot(t,'EdgeLabel',cellstr(t.Edges.Mode))

Используйте метод агрегации 'sum' и задайте значение 'AggregationVariables' как 'Cost', чтобы вычислить, сколько денег сделано на каждой связи.

c = simplify(G,'sum','AggregationVariables','Cost');
plot(c,'EdgeLabel',c.Edges.Cost)

Входные параметры

свернуть все

Входной график, заданный как объект граф или диграф. Используйте граф для создания неориентированного графа или диграф для создания ориентированного графа.

Пример: G = graph(1,2)

Пример: G = digraph([1 2],[2 3])

Метод выбора ребра, заданный как 'first', 'last', 'min' или 'max'. Метод выбора ребра обеспечивает способ выбрать, какое из нескольких ребер, чтобы сохранить, когда больше чем одно ребро существует между теми же двумя узлами.

  • Если методом является 'first' или 'last', то simplify сохраняет только первое или последнее ребро, которое происходит в таблице G.Edges ребер.

  • Если методом является 'min' или 'max', то simplify сохраняет только ребро с минимальным или максимальным весом. Переменная Weight должна существовать в G.Edges, если вы не используете пару "имя-значение" 'PickVariable', чтобы основывать выбор на различной переменной.

Пример: simplify(G,'last')

Метод агрегации, заданный или как 'sum' или как 'mean'. Метод агрегации обеспечивает способ объединить несколько ребер в одно ребро, когда существует больше чем одно ребро между теми же двумя узлами.

По умолчанию simplify только суммирует или составляет в среднем вес ребра в графике и пропускает все другие свойства ребра. Однако можно использовать пару "имя-значение" 'AggregationVariables', чтобы задать который числовые переменные в G.Edges сохранить и агрегироваться.

Пример: simplify(G,'sum')

Переключитесь, чтобы сохранить самоциклы, заданные как также:

  • 'omitselfloops' — Удалите все самоциклы из графика. Это значение по умолчанию.

  • 'keepselfloops' — Узлы с одним или несколькими самоциклами имеют один самоцикл в упрощенном графике.

Пример: simplify(G,'sum','keepselfloops')

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: H = simplify(G,'sum','AggregationVariables',{'Var1' 'Var2'})

Переменная, чтобы основывать выбор ребра на, заданный как пара, разделенная запятой, состоящая из 'PickVariable' и имени переменной или числового индекса. Используйте эту пару "имя-значение", чтобы выбрать переменную ребра в G.Edges кроме 'Weight', чтобы использовать с 'min' или методами выбора 'max'. simplify сохраняет только ребро с минимальным или максимальным значением выбранной переменной, когда существует несколько ребер между теми же двумя узлами.

Пример: simplify(G,'min','PickVariable',3)

Пример: simplify(G,'min','PickVariable','var3')

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | char | string

Переменные, чтобы агрегироваться, заданный как пара, разделенная запятой, состоящая из 'AggregationVariables' и имени переменной, массива ячеек имен переменных, массива строк, числового вектора, логического вектора или указателя на функцию. Используйте эту пару "имя-значение", чтобы выбрать одну или несколько переменных ребра в G.Edges, который может быть объединен с 'sum' или методами агрегации 'mean'. simplify комбинирует значения этих переменных в одно значение для одного нового ребра, когда существует несколько ребер между теми же двумя узлами. Значение 'AggregationVariables' может быть одним из следующего:

  • Вектор символов, задающий одно имя табличной переменной

  • Массив ячеек из символьных векторов, где каждый элемент является именем табличной переменной

  • Массив строк, задающий одни или несколько имен переменных

  • Вектор индексов табличной переменной

  • Логический вектор, элементы которого соответствуют табличным переменным, где true включает соответствующую переменную и false, исключает его

  • Указатель на функцию, который берет таблицу G.Edges, как введено и возвращает логический скаляр, такой как @isnumeric

Пример: simplify(G,'sum','AggregationVariables',[4 5 6])

Пример: simplify(G,'mean','AggregationVariables',{'var5 var7'})

Пример: simplify(G,'mean','AggregationVariables',@isnumeric)

Типы данных: single | double | logical | function_handle | char | string | cell

Выходные аргументы

свернуть все

Упрощенный график, возвращенный как объект graph или digraph. H не содержит повторных ребер между теми же двумя узлами, такими, что ismultigraph(H) возвращает логический 0 (false). Самоциклы также удалены, если вы не задаете опцию 'keepselfloops'.

Индексы ребра, возвращенные как вектор. Ребро в H, который представляет ребро i в G, дано H.Edges(eind(i),:). Если ребро, i в G является самоциклом, который был удален, то eind(i) является 0.

Количества ребра, возвращенные как вектор. ecount(i) является количеством ребер в G, которые соответствуют ребру i в H.

Смотрите также

| |

Введенный в R2018a