график

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

Описание

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

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

Создание

Синтаксис

G = graph
G = graph(A)
G = graph(A,nodenames)
G = graph(A,NodeTable)
G = graph(A,___,type)
G = graph(A,___,'omitselfloops')
G = graph(s,t)
G = graph(s,t,weights)
G = graph(s,t,weights,nodenames)
G = graph(s,t,weights,NodeTable)
G = graph(s,t,weights,num)
G = graph(s,t,___,'omitselfloops')
G = graph(s,t,EdgeTable,___)
G = graph(EdgeTable)
G = graph(EdgeTable,NodeTable)
G = graph(EdgeTable,___,'omitselfloops')

Описание

пример

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 могут задать индексы узла или имена узла.

пример

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. Вход EdgeTable должен быть таблицей со строкой для каждой соответствующей пары элементов в s и t. Задайте вес ребра с помощью табличной переменной Weight.

пример

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

пример

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 являются векторами символов, массивами ячеек из символьных векторов или строковыми массивами, то они задают имена для узлов. Свойство Nodes графика является таблицей, содержащей переменную Name с именами узла, G.Nodes.Name.

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

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

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

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

Скаляр

Пример 1

Вектор

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

Имя узла

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

Пример: 'A'

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

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

Скаляр строки

Пример: "A"

StringArray

Пример: ["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 требуется, чтобы быть матрицей 2D столбца, массивом ячеек из символьных векторов или массивом строк под названием 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. Для получения дополнительной информации смотрите graph.

Свойства

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

Ребра графика, возвращенного как таблица. По умолчанию это - M-by-1 таблица, где M является количеством ребер в графике.

  • Чтобы добавить новые свойства ребра в график, создайте новую переменную в таблице 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Извлечение подграфа
bfsearchПоиск графика в ширину
dfsearchПоиск графика в глубину
centralityИзмерьте важность узла
conncompКомпоненты связного графа
biconncompКомпоненты графа без сочленений
bctreeСокращенный из блока древовидный граф
maxflowМаксимальный поток в графике
minspantreeМинимальное дерево охвата графика
isisomorphicОпределите, изоморфны ли два графика
isomorphismВычислите изоморфизм между двумя графиками
ismultigraphОпределите, имеет ли график несколько ребер
simplifyУменьшайте мультиграф до простого графика
shortestpathКратчайший путь между двумя одним узлами
shortestpathtreeДерево кратчайшего пути от узла
distancesРасстояния кратчайшего пути всех пар узла
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)

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

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)

Создайте взвешенный график с помощью списка конечных узлов каждого ребра. Укажите, что график должен содержать в общей сложности 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)

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

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

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

Поведение изменяется в R2018a

Введенный в R2015b