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

пример

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

пример

G = graph(s,t,weights,nodenames) задает имена узла с помощью массива ячеек из символьных векторов или массива строк, nodenamesS и 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"

Массив строк

Пример: ["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 объект.

Свойства

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

Ребра графика, возвращенного как таблица. По умолчанию это - M- 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- 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 таблицы, чтобы описать атрибуты вершин графика или ребер. Однако вы не можете непосредственно изменить количество узлов или ребер в графике путем изменения этих таблиц. Вместо этого используйте addedgermedgeaddnode, или 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