digraph

График с ориентированными ребрами

Описание

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. The 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 являются векторами символов, массивами ячеек из векторов символов или строковыми массивами, затем они задают имена для узлов. The 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-by- 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-by- 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.

Создайте пустой объект диграф, 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