graph

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

Описание

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

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

Создание

Описание

пример

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

пример

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

пример

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

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

пример

G = graph(A,___,type) задает треугольник матрицы смежности, используемый при построении графика. Вы должны задать A и опционально может задать nodenames или NodeTable. Чтобы использовать только верхний или нижний треугольник A чтобы создать график, type может быть либо 'upper' или 'lower'.

пример

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

пример

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

пример

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

пример

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

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

пример

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

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

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

пример

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

пример

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

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

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

расширить все

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

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

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

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

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

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

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

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

Тип матрицы смежности, заданный как 'upper' или 'lower'.

Пример: G = graph(A,'upper') использует только верхний треугольник A чтобы создать график, G.

Пары узлов, заданные как индексы узлов или имена узлов. graph создает ребра между соответствующими узлами в 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 = graph([1 2 3],[2 4 5]) создает график с пятью узлами и тремя ребрами.

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

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

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

Если вы задаете weights как пустой массив [], затем это игнорируется.

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

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

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

Пример: G = graph([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

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

расширить все

Неориентированный граф, возвращенный как graph объект. Список ребер в 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Удалите ребро из графика
addnodeДобавьте новый узел к графику
rmnodeУдалите узел из графика
findedgeНайдите ребро в графике
findnodeНайдите узел в графике
numedgesКоличество ребер в графике
numnodesЧисло узлов в графике
edgecountКоличество ребер между двумя узлами
reordernodesПереупорядочить узлы графика
subgraphИзвлечь подграфик
centralityИзмерьте важность узла
conncompСвязанные компоненты графика
biconncompДвухсоединенные компоненты графика
bctreeДревовидный граф с блочным графиком
isisomorphicОпределите, являются ли два графиков изоморфными
isomorphismВычислите изоморфизм между двумя графиками
ismultigraphОпределите, имеет ли график несколько ребер
simplifyУменьшите мультиграфик до простого графика
bfsearchПоиск по графику
dfsearchПоиск по графику глубина-первая
shortestpathСамый короткий путь между двумя одинарными узлами
shortestpathtreeДерево кратчайших путей из узла
distancesСамые короткие расстояния пути для всех пар узлов
maxflowМаксимальный поток в графике
minspantreeМинимальное покрывающее дерево графика
allpathsНайдите все пути между двумя узлами графика
hascyclesОпределите, содержит ли график циклы
allcyclesНайти все циклы в графике
cyclebasisБазис фундаментального цикла графика
adjacencyМатрица смежности графика
incidenceМатрица инцидентности графика
laplacianГрафик Матрицы Лапласа
degreeСтепень графиков
neighborsСоседи графика
nearestБлижайшие соседи в радиусе
outedgesИсходящие ребра из узла
plotГрафик графика узлы и ребра

Примеры

свернуть все

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

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

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

Просмотрите таблицу ребер графика.

G.Edges
ans=2×1 table
    EndNodes
    ________

     1    2 
     1    3 

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

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

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

G.Edges
ans=2×1 table
       EndNodes   
    ______________

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

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

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

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

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

G.Edges
ans=3×1 table
       EndNodes   
    ______________

    {'A'}    {'B'}
    {'A'}    {'C'}
    {'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 = graph(A~=0)
G = 
  graph with properties:

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

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

G.Edges
ans=6×1 table
    EndNodes
    ________

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

Создайте верхнюю треугольную матрицу смежности.

A = triu(magic(4))
A = 4×4

    16     2     3    13
     0    11    10     8
     0     0     6    12
     0     0     0     1

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

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

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

Просмотрите информацию о ребре и узле.

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

    {'alpha'}    {'beta' }       2  
    {'alpha'}    {'gamma'}       3  
    {'alpha'}    {'delta'}      13  
    {'beta' }    {'gamma'}      10  
    {'beta' }    {'delta'}       8  
    {'gamma'}    {'delta'}      12  

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 = graph(s,t)
G = 
  graph with properties:

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

plot(G)

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 = graph(s,t,weights,names)
G = 
  graph with properties:

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

plot(G,'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 = graph(s,t,weights,10)
G = 
  graph with properties:

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

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

plot(G)

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

Создайте пустой объект графика, G.

G = graph;

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

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

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

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

G.Edges
ans=3×1 table
    EndNodes
    ________

     1    2 
     1    3 
     2    3 

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

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

s = [1 1 1 2 3];
t = [2 3 4 3 4];
weights = [6 6.5 7 11.5 17]';
code = {'1/44' '1/49' '1/33' '44/49' '49/33'}';
EdgeTable = table([s' t'],weights,code, ...
    'VariableNames',{'EndNodes' 'Weight' 'Code'})
EdgeTable=5×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'}
     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 = graph(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