exponenta event banner

диграф

График с направленными рёбрами

Описание

digraph объекты представляют собой направленные графики, имеющие направленные ребра, соединяющие узлы. После создания digraph можно узнать больше о графике, используя функции объекта для выполнения запросов к объекту. Например, можно добавить или удалить узлы или кромки, определить кратчайший путь между двумя узлами или найти определенный узел или кромку.

G = digraph([1 1], [2 3])
e = G.Edges
G = addedge(G,2,3)
G = addnode(G,4)
plot(G)

Создание

Описание

пример

G = digraph создает пустой направленный объект графа, G, который не имеет узлов или ребер.

пример

G = digraph(A) создает взвешенный направленный график с использованием квадратной матрицы смежности, A. Расположение каждой ненулевой записи в A задает ребро для графика, а вес ребра равен значению записи. Например, если A(2,1) = 10, то G содержит ребро от узла 2 к узлу 1 с весом 10.

пример

G = digraph(A,nodenames) дополнительно указывает имена узлов. Количество элементов в nodenames должно быть равно size(A,1).

G = digraph(A,NodeTable) определяет имена узлов (и, возможно, другие атрибуты узлов) с помощью таблицы, NodeTable. Таблица должна иметь то же количество строк, что и A. Укажите имена узлов с помощью переменной таблицы Name.

пример

G = digraph(A,___,'omitselfloops') игнорирует диагональные элементы A и возвращает граф без каких-либо автоциклов. В предыдущих синтаксисах можно использовать любую комбинацию входных аргументов.

пример

G = digraph(s,t) задание направленных ребер графика (s,t) попарно для представления исходного и целевого узлов. s и t может указывать индексы узлов или имена узлов. digraph сортировка ребер в G сначала по исходному узлу, а затем по целевому узлу. При наличии свойств кромки в том же порядке, что и s и t, используйте синтаксис G = digraph(s,t,EdgeTable) чтобы передать свойства рёбер таким образом, чтобы они были отсортированы таким же образом в полученном графике.

пример

G = digraph(s,t,weights) также указывает веса кромок с массивом weights.

пример

G = digraph(s,t,weights,nodenames) дополнительно задает имена узлов с помощью массива ячеек символьных векторов или строкового массива, nodenames. s и t не может содержать имена узлов, отсутствующие в nodenames.

G = digraph(s,t,weights,NodeTable) определяет имена узлов (и, возможно, другие атрибуты узлов) с помощью таблицы, NodeTable. Укажите имена узлов с помощью Name табличная переменная. s и t не может содержать имена узлов, отсутствующие в NodeTable.

пример

G = digraph(s,t,weights,num) указывает количество узлов в графе с числовым скаляром num.

G = digraph(s,t,___,'omitselfloops') не добавляет к графу никаких самокольцов. То есть любой k что удовлетворяет s(k) == t(k) игнорируется. В предыдущих синтаксисах можно использовать любую комбинацию входных аргументов.

G = digraph(s,t,EdgeTable,___) использует таблицу для указания атрибутов кромки вместо указания weights. EdgeTable ввод должен быть таблицей со строкой для каждой соответствующей пары элементов в s и t. Задание веса кромок с помощью переменной таблицы Weight.

пример

G = digraph(EdgeTable) использует таблицу EdgeTable для определения графика. С таким синтаксисом первая переменная в EdgeTable должно быть названо EndNodes, и это должен быть массив из двух столбцов, определяющий список рёбер графа.

пример

G = digraph(EdgeTable,NodeTable) дополнительно задает имена (и, возможно, другие атрибуты) узлов графика с помощью таблицы, NodeTable.

G = digraph(EdgeTable,___,'omitselfloops') не добавляет самокольцы к графу. То есть любой k что удовлетворяет EdgeTable.EndNodes(k,1) == EdgeTable.EndNodes(k,2) игнорируется. Необходимо указать EdgeTable и дополнительно может указать NodeTable.

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

развернуть все

Матрица смежности, заданная как полная или разреженная числовая матрица. Записи в A укажите сеть соединений (рёбер) между узлами графа. Расположение каждой ненулевой записи в A определяет ребро между двумя узлами. Значение этой записи определяет вес края. Логическая матрица смежности приводит к невзвешенному графу.

Ненулевые записи на главной диагонали A укажите самокольцы или узлы, которые соединены друг с другом ребром. Используйте 'omitselfloops' параметр ввода для игнорирования диагональных записей.

Пример: A = [0 1 0; 0 0 0; 5 0 0] описывает граф с тремя узлами и двумя рёбрами. Край от узла 1 до узла 2 имеет вес 1и край от узла 3 к узлу 1 имеет вес 5.

Типы данных: single | double | logical

Имена узлов, заданные как массив ячеек символьных векторов или строковый массив. nodenames должна иметь длину, равную numnodes(G) чтобы он содержал непустое уникальное имя для каждого узла в графе.

Пример: G = digraph(A,{'n1','n2','n3'}) задает три имени узлов для матрицы смежности 3 на 3, A.

Типы данных: cell | string

Пары исходного и целевого узлов, указанные как индексы узлов или имена узлов. digraph создает направленные кромки между соответствующими узлами в s и t, которые оба должны быть числовыми, или оба должны быть символьными векторами, массивами ячеек символьных векторов, категориальными массивами или строковыми массивами. Во всех случаях: s и t должен иметь одинаковое количество элементов.

  • Если s и t числовые, то они соответствуют индексам узлов графа. Числовые индексы узлов должны быть положительными целыми числами, большими или равными 1.

  • Если s и t - символьные векторы, массивы ячеек символьных векторов или строковые массивы, затем задают имена узлов. Nodes свойство графа представляет собой таблицу, содержащую Name переменная с именами узлов, G.Nodes.Name.

  • Если s и t категориальные массивы, затем категории в s и t используются в качестве имен узлов на графике. Это может включать категории, которые не являются элементами в s или t.

  • Если s и t укажите несколько ребер между одними и теми же двумя узлами, в результате чего получится мультиграф.

В этой таблице показаны различные способы ссылки на один или несколько узлов по их числовым индексам узлов или по их именам.

ФормаОдин узелНесколько узлов
Индекс узла

Скаляр

Пример: 1

Вектор

Пример: [1 2 3]

Имя узла

Символьный вектор

Пример: 'A'

Массив ячеек символьных векторов

Пример: {'A' 'B' 'C'}

Строковый скаляр

Пример: "A"

Строковый массив

Пример: ["A" "B" "C"]

Категориальный массив

Пример: categorical("A")

Категориальный массив

Пример: categorical(["A" "B" "C"])

Пример: G = digraph([1 2 3],[2 4 5]) создает граф с пятью узлами и тремя рёбрами.

Пример: G = digraph({'Boston' 'New York' 'Washington D.C.'},{'New York' 'New Jersey' 'Pittsburgh'}) создает график с пятью именованными узлами и тремя ребрами.

Веса ребер, заданные как скаляр, вектор, матрица или многомерный массив. weights должен быть скаляром или массивом с таким же количеством элементов, как s и t.

digraph сохраняет веса кромок в виде Weight переменной в G.Edges таблица свойств. Чтобы добавить или изменить веса после создания графика, можно изменить табличную переменную непосредственно, например: G.Edges.Weight = [25 50 75]'.

При указании weights как пустой массив [], то он игнорируется.

Пример: G = digraph([1 2],[2 3],[100 200]) создает график с тремя узлами и двумя рёбрами. Края имеют вес 100 и 200.

Типы данных: single | double

Число узлов графа, указанное как положительное скалярное целое число. num должно быть больше или равно наибольшим элементам в s и t.

Пример: G = digraph([1 2],[2 3],[],5) создает граф с тремя связными узлами и двумя изолированными узлами.

Таблица информации о границах. Если не указать s и t, то первая переменная в EdgeTable должен быть матрицей из двух столбцов, массивом ячеек символьных векторов или строковым массивом с именем EndNodes определяет ребра графика. Для веса кромок используйте переменную Weight, поскольку это имя табличной переменной используется некоторыми графовыми функциями. При наличии переменной Weight, то он должен быть числовым вектором столбца. Посмотрите table для получения дополнительной информации о построении таблицы.

После создания графика запросите таблицу информации о кромках с помощью G.Edges.

Пример: EdgeTable = table([1 2; 2 3; 3 5; 4 5],'VariableNames',{'EndNodes'})

Типы данных: table

Таблица информации о узле. NodeTable может содержать любое количество переменных для описания атрибутов узлов графика. Для имен узлов используйте переменную Name, поскольку это имя переменной используется некоторыми графовыми функциями. При наличии переменной Name, то это должен быть массив ячеек символьных векторов или строковый массив, указывающий уникальное имя в каждой строке. Посмотрите table для получения дополнительной информации о построении таблицы.

После создания графика выполните запрос к информационной таблице узла с помощью G.Nodes.

Пример: NodeTable = table({'a'; 'b'; 'c'; 'd'},'VariableNames',{'Name'})

Типы данных: table

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

развернуть все

Направленный граф, возвращенный как digraph объект. Список кромок в G.Edges.EndNodes сортируется сначала по исходному узлу, а затем по целевому узлу.

Свойства

развернуть все

Рёбра графа, возвращаемые в виде таблицы. По умолчанию это Mоколо-1 таблица, где M - количество рёбер в графе. Список кромок в G.Edges.EndNodes сортируется сначала по исходному узлу, а затем по целевому узлу.

  • Чтобы добавить в график новые свойства ребер, создайте новую переменную в Edges таблица.

  • Чтобы добавить или удалить ребра из графика, используйте addedge или rmedge функции объекта.

Пример: G.Edges возвращает таблицу со списком рёбер на графике

Пример: G.Edges.Weight возвращает числовой вектор весов ребер.

Пример: G.Edges.Weight = [10 20 30 55]' задает новые веса ребер для графика.

Пример: G.Edges.NormWeight = G.Edges.Weight/sum(G.Edges.Weight) добавляет новое свойство кромки в таблицу, содержащую нормализованные веса кромок.

Типы данных: table

Узлы графа, возвращаемые в виде таблицы. По умолчанию это пустое Nоколо-0 таблица, где N - количество узлов в графе.

  • Чтобы добавить в график новые свойства узла, создайте новую переменную в Nodes таблица.

  • Чтобы добавить или удалить узлы из графика, используйте addnode или rmnode функции объекта.

Пример: G.Nodes возвращает таблицу со списком свойств узла графика. По умолчанию эта таблица пуста.

Пример: G.Nodes.Names = {'Montana', 'New York', 'Washington', 'California'}' добавляет имена узлов к графу, добавляя переменную Names в Nodes таблица.

Пример: G.Nodes.WiFi = logical([1 0 0 1 1]') добавляет переменную WiFi в Nodes таблица. Это свойство указывает, что некоторые аэропорты имеют беспроводной доступ в Интернет.

Типы данных: table

Функции объекта

развернуть все

addedgeДобавить новое ребро к графу
rmedgeУдалить ребро из графика
flipedgeОбратные направления кромок
addnodeДобавить новый узел в график
rmnodeУдалить узел из графика
findedgeНайти ребро на графике
findnodeНайти узел на графике
numedgesКоличество рёбер в графике
numnodesКоличество узлов в графе
edgecountКоличество ребер между двумя узлами
reordernodesПереупорядочить узлы графика
subgraphИзвлечь подграф
centralityИзмерение важности узла
toposortТопологический порядок направленного ациклического графа
transclosureПереходное замыкание
transreductionПереходное уменьшение
isdagОпределить, является ли график ациклическим
conncompСвязанные компоненты графика
condensationГрафик конденсации
maxflowМаксимальный расход на графике
isisomorphicОпределить, являются ли два графика изоморфными
isomorphismВычислить изоморфизм между двумя графами
ismultigraphОпределение наличия нескольких рёбер на графике
simplifyСокращение мультиграфа до простого графика
bfsearchПоиск графов по ширине
dfsearchПоиск по графу с первой глубиной
shortestpathКратчайший путь между двумя одиночными узлами
shortestpathtreeДерево кратчайшего пути от узла
distancesКратчайшие расстояния пути для всех пар узлов
allpathsПоиск всех путей между двумя узлами графика
hascyclesОпределить, содержит ли график циклы
allcyclesНайти все циклы на графике
adjacencyМатрица смежности графа
incidenceМатрица частоты падения графика
indegreeСтепень расположения узлов
outdegreeСтепень отсутствия узлов
predecessorsПредшественники узлов
successorsПравопреемники узлов
nearestБлижайшие соседи в радиусе
inedgesВходящие ребра в узел
outedgesИсходящие кромки из узла
plotПечать узлов и ребер графика

Примеры

свернуть все

Создать digraph объект с тремя узлами и тремя ребрами. Один край находится от узла 1 к узлу 2, другой - от узла 1 к узлу 3, а третий - от узла 2 к узлу 1.

G = digraph([1 1 2],[2 3 1])
G = 
  digraph with properties:

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

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

G.Edges
ans=3×1 table
    EndNodes
    ________

     1    2 
     1    3 
     2    1 

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

G.Nodes.Name = {'A' 'B' 'C'}';
G.Nodes
ans=3×1 table
    Name 
    _____

    {'A'}
    {'B'}
    {'C'}

G.Edges
ans=3×1 table
       EndNodes   
    ______________

    {'A'}    {'B'}
    {'A'}    {'C'}
    {'B'}    {'A'}

Можно добавить или изменить дополнительные переменные в Nodes и Edges таблицы для описания атрибутов узлов или ребер графика. Однако непосредственно изменить количество узлов или рёбер на графике, изменив эти таблицы, невозможно. Вместо этого используйте addedge, rmedge, addnode, или rmnode для изменения количества узлов или рёбер в графике.

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

G = addedge(G,2,3)
G = 
  digraph with properties:

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

G.Edges
ans=4×1 table
       EndNodes   
    ______________

    {'A'}    {'B'}
    {'A'}    {'C'}
    {'B'}    {'A'}
    {'B'}    {'C'}

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

A = ones(4) - diag([1 1 1 1])
A = 4×4

     0     1     1     1
     1     0     1     1
     1     1     0     1
     1     1     1     0

G = digraph(A~=0)
G = 
  digraph with properties:

    Edges: [12x1 table]
    Nodes: [4x0 table]

Просмотр списка кромок графика.

G.Edges
ans=12×1 table
    EndNodes
    ________

     1    2 
     1    3 
     1    4 
     2    1 
     2    3 
     2    4 
     3    1 
     3    2 
     3    4 
     4    1 
     4    2 
     4    3 

Создайте матрицу смежности.

A = magic(4);
A(A>10) = 0
A = 4×4

     0     2     3     0
     5     0    10     8
     9     7     6     0
     4     0     0     1

Создайте график с именованными узлами, используя матрицу смежности. Определить 'omitselfloops' чтобы игнорировать записи на диагонали A.

names = {'alpha' 'beta' 'gamma' 'delta'};
G = digraph(A,names,'omitselfloops')
G = 
  digraph with properties:

    Edges: [8x2 table]
    Nodes: [4x1 table]

Просмотрите сведения о ребре и узле.

G.Edges
ans=8×2 table
           EndNodes           Weight
    ______________________    ______

    {'alpha'}    {'beta' }       2  
    {'alpha'}    {'gamma'}       3  
    {'beta' }    {'alpha'}       5  
    {'beta' }    {'gamma'}      10  
    {'beta' }    {'delta'}       8  
    {'gamma'}    {'alpha'}       9  
    {'gamma'}    {'beta' }       7  
    {'delta'}    {'alpha'}       4  

G.Nodes
ans=4×1 table
      Name   
    _________

    {'alpha'}
    {'beta' }
    {'gamma'}
    {'delta'}

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

s = [1 1 1 2 2 3 3 4 5 5 6 7];
t = [2 4 8 3 7 4 6 5 6 8 7 8];
G = digraph(s,t)
G = 
  digraph with properties:

    Edges: [12x1 table]
    Nodes: [8x0 table]

plot(G,'Layout','force')

Figure contains an axes. The axes contains an object of type graphplot.

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

s = [1 1 1 2 2 3 3 4 5 5 6 7];
t = [2 4 8 3 7 4 6 5 6 8 7 8];
weights = [10 10 1 10 1 10 1 1 12 12 12 12];
names = {'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H'};
G = digraph(s,t,weights,names)
G = 
  digraph with properties:

    Edges: [12x2 table]
    Nodes: [8x1 table]

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

Figure contains an axes. The axes contains an object of type graphplot.

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

s = [1 1 1 1 1];
t = [2 3 4 5 6];
weights = [5 5 5 6 9];
G = digraph(s,t,weights,10)
G = 
  digraph with properties:

    Edges: [5x2 table]
    Nodes: [10x0 table]

Постройте график. Дополнительные узлы отсоединены от основного подключенного компонента.

plot(G)

Figure contains an axes. The axes contains an object of type graphplot.

Создайте пустой объект digraph, G.

G = digraph;

Добавьте к графу три узла и три ребра. Соответствующие записи в s и t определите исходный и целевой узлы кромок. addedge автоматически добавляет соответствующие узлы в график, если они еще не присутствуют.

s = [1 2 1];
t = [2 3 3];
G = addedge(G,s,t)
G = 
  digraph with properties:

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

Просмотр списка кромок. Каждая строка описывает ребро в графике.

G.Edges
ans=3×1 table
    EndNodes
    ________

     1    2 
     1    3 
     2    3 

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

Создание таблицы кромок, содержащей переменные EndNodes, Weight, и Code. Затем создайте таблицу узлов, содержащую переменные. Name и Country. Переменные в каждой таблице определяют свойства узлов и ребер графика.

s = [1 1 1 2 2 3];
t = [2 3 4 3 4 4];
weights = [6 6.5 7 11.5 12 17]';
code = {'1/44' '1/49' '1/33' '44/49' '44/33' '49/33'}';
EdgeTable = table([s' t'],weights,code, ...
    'VariableNames',{'EndNodes' 'Weight' 'Code'})
EdgeTable=6×3 table
    EndNodes    Weight      Code   
    ________    ______    _________

     1    2         6     {'1/44' }
     1    3       6.5     {'1/49' }
     1    4         7     {'1/33' }
     2    3      11.5     {'44/49'}
     2    4        12     {'44/33'}
     3    4        17     {'49/33'}

names = {'USA' 'GBR' 'DEU' 'FRA'}';
country_code = {'1' '44' '49' '33'}';
NodeTable = table(names,country_code,'VariableNames',{'Name' 'Country'})
NodeTable=4×2 table
     Name      Country
    _______    _______

    {'USA'}    {'1' } 
    {'GBR'}    {'44'} 
    {'DEU'}    {'49'} 
    {'FRA'}    {'33'} 

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

G = digraph(EdgeTable,NodeTable);
plot(G,'NodeLabel',G.Nodes.Country,'EdgeLabel',G.Edges.Code)

Figure contains an axes. The axes contains an object of type graphplot.

Вопросы совместимости

развернуть все

В R2018a изменилось поведение

Представлен в R2015b