Найти все циклы на графике
[ также возвращает ребра в каждом цикле. Продукция cycles,edgecycles] = allcycles(G)edgecycles - массив ячеек, где edgecycles{k} дает ребра в соответствующем цикле, cycles{k}.
[___] = allcycles( указывает дополнительные параметры, использующие один или несколько аргументов «имя-значение». В предыдущих синтаксисах можно использовать любую комбинацию выходных аргументов. Например, можно указать G,Name,Value)MaxNumCycles и скаляр для ограничения количества возвращаемых циклов.
Создайте направленный граф с девятью узлами. Постройте график.
s = [1 2 3 6 5 5 4 6 9 8 8 7]; t = [2 3 6 5 2 4 1 9 8 5 7 4]; G = digraph(s,t); plot(G)

Вычислите все циклы на графике.
cycles = allcycles(G)
cycles=5×1 cell array
{[ 1 2 3 6 5 4]}
{[1 2 3 6 9 8 5 4]}
{[1 2 3 6 9 8 7 4]}
{[ 2 3 6 5]}
{[ 2 3 6 9 8 5]}
Второй выходной аргумент allcycles возвращает ребра, содержащиеся в каждом цикле. Это особенно полезно для мультиграфов, где индекс края необходим для однозначной идентификации краев в каждом цикле.
Создайте направленный мультиграф с восемью узлами и 18 ребрами. Укажите имена узлов. Постройте график с помеченными узлами и рёбрами.
s = [1 1 2 2 3 3 2 2 4 6 8 6 6 7 3 3 5 3];
t = [2 3 1 3 2 1 4 4 6 2 6 7 8 8 5 5 7 7];
names = {'A','B','C','D','E','F','G','H'};
G = digraph(s,t,[],names);
p = plot(G,'EdgeLabel',1:numedges(G));
Вычислите все циклы на графике. Укажите два выходных аргумента, чтобы вернуть индексы кромок в каждом цикле.
[cycles,edgecycles] = allcycles(G);
Просмотр узлов и кромок в пятом цикле.
cycles{5}ans = 1x7 cell
{'A'} {'C'} {'E'} {'G'} {'H'} {'F'} {'B'}
edgecycles{5}ans = 1×7
2 9 13 17 18 14 3
Выделите узлы и кромки в пятом цикле.
highlight(p,'Edges',edgecycles{5},'EdgeColor','r','LineWidth',1.5,'NodeColor','r','MarkerSize',6)

Используйте 'MaxNumCycles', 'MaxCycleLength', и 'MinCycleLength' для ограничения количества циклов, возвращаемых allcycles.
Создайте матрицу смежности для полного графика с 20 узлами. Создайте неориентированный граф из матрицы смежности, пропустив автоциклы.
A = ones(20);
G = graph(A,'omitselfloops');Поскольку все узлы в графе связаны со всеми остальными узлами, в графе имеется большое количество циклов (более чем 1.7e17). Следовательно, невозможно вычислить все циклы, так как результаты не умещаются в памяти. Вместо этого вычислите первые 10 циклов.
cycles1 = allcycles(G,'MaxNumCycles',10)cycles1=10×1 cell array
{[ 1 2 3]}
{[ 1 2 3 4]}
{[ 1 2 3 4 5]}
{[ 1 2 3 4 5 6]}
{[ 1 2 3 4 5 6 7]}
{[ 1 2 3 4 5 6 7 8]}
{[ 1 2 3 4 5 6 7 8 9]}
{[ 1 2 3 4 5 6 7 8 9 10]}
{[ 1 2 3 4 5 6 7 8 9 10 11]}
{[1 2 3 4 5 6 7 8 9 10 11 12]}
Теперь рассчитайте первые 10 циклов, длина которых меньше или равна 3.
cycles2 = allcycles(G,'MaxNumCycles',10,'MaxCycleLength',3)
cycles2=10×1 cell array
{[ 1 2 3]}
{[ 1 2 4]}
{[ 1 2 5]}
{[ 1 2 6]}
{[ 1 2 7]}
{[ 1 2 8]}
{[ 1 2 9]}
{[1 2 10]}
{[1 2 11]}
{[1 2 12]}
Наконец, вычислите первые 10 циклов, длина которых больше или равна 4.
cycles3 = allcycles(G,'MaxNumCycles',10,'MinCycleLength',4)
cycles3=10×1 cell array
{[ 1 2 3 4]}
{[ 1 2 3 4 5]}
{[ 1 2 3 4 5 6]}
{[ 1 2 3 4 5 6 7]}
{[ 1 2 3 4 5 6 7 8]}
{[ 1 2 3 4 5 6 7 8 9]}
{[ 1 2 3 4 5 6 7 8 9 10]}
{[ 1 2 3 4 5 6 7 8 9 10 11]}
{[ 1 2 3 4 5 6 7 8 9 10 11 12]}
{[1 2 3 4 5 6 7 8 9 10 11 12 13]}
Изучение того, каким образом осуществляется вывод cyclebasis и allcycles функции масштабируются с числом рёбер в графе.
Создайте и постройте график квадратной сетки с тремя узлами на каждой стороне квадрата.
n = 5; A = delsq(numgrid('S',n)); G = graph(A,'omitselfloops'); plot(G)

Вычислить все циклы на графике с помощью allcycles. Используйте tiledlayout функция для построения массива вложенных графиков и выделения каждого цикла в вложенном графике. Результаты показывают, что всего на графике 13 циклов.
[cycles,edgecycles] = allcycles(G); tiledlayout flow for k = 1:length(cycles) nexttile highlight(plot(G),cycles{k},'Edges',edgecycles{k},'EdgeColor','r','NodeColor','r') title("Cycle " + k) end

Некоторые из этих циклов можно рассматривать как комбинации меньших циклов. cyclebasis функция возвращает подмножество циклов, которые образуют базис для всех остальных циклов графа. Использовать cyclebasis вычислить базис фундаментального цикла и выделить каждый фундаментальный цикл в вложенном графике. Хотя в графе 13 циклов, существует только четыре фундаментальных цикла.
[cycles,edgecycles] = cyclebasis(G); tiledlayout flow for k = 1:length(cycles) nexttile highlight(plot(G),cycles{k},'Edges',edgecycles{k},'EdgeColor','r','NodeColor','r') title("Cycle " + k) end

Теперь увеличьте число узлов на каждой стороне квадратного графа с трёх до четырёх. Это представляет небольшое увеличение размера графа.
n = 6; A = delsq(numgrid('S',n)); G = graph(A,'omitselfloops'); figure plot(G)

Использовать allcycles для вычисления всех циклов в новом графике. Для этого графа существует более 200 циклов, что слишком много для построения графика.
allcycles(G)
ans=213×1 cell array
{[ 1 2 3 4 8 7 6 5]}
{[ 1 2 3 4 8 7 6 10 9 5]}
{[1 2 3 4 8 7 6 10 11 12 16 15 14 13 9 5]}
{[ 1 2 3 4 8 7 6 10 11 15 14 13 9 5]}
{[ 1 2 3 4 8 7 6 10 14 13 9 5]}
{[ 1 2 3 4 8 7 11 10 6 5]}
{[ 1 2 3 4 8 7 11 10 9 5]}
{[ 1 2 3 4 8 7 11 10 14 13 9 5]}
{[ 1 2 3 4 8 7 11 12 16 15 14 10 6 5]}
{[ 1 2 3 4 8 7 11 12 16 15 14 10 9 5]}
{[ 1 2 3 4 8 7 11 12 16 15 14 13 9 5]}
{[1 2 3 4 8 7 11 12 16 15 14 13 9 10 6 5]}
{[ 1 2 3 4 8 7 11 15 14 10 6 5]}
{[ 1 2 3 4 8 7 11 15 14 10 9 5]}
{[ 1 2 3 4 8 7 11 15 14 13 9 5]}
{[ 1 2 3 4 8 7 11 15 14 13 9 10 6 5]}
⋮
Несмотря на большое количество циклов в графе, cyclebasis по-прежнему возвращает небольшое число фундаментальных циклов. Каждый из циклов в графе может быть построен с использованием только девяти фундаментальных циклов.
[cycles,edgecycles] = cyclebasis(G); figure tiledlayout flow for k = 1:length(cycles) nexttile highlight(plot(G),cycles{k},'Edges',edgecycles{k},'EdgeColor','r','NodeColor','r') title("Cycle " + k) end

Большое увеличение числа циклов с лишь небольшим изменением размера графа характерно для некоторых структур графа. Количество циклов, возвращаемых allcycles может расти экспоненциально с числом рёбер в графе. Однако количество циклов, возвращаемых cyclebasis может, самое большее, вырасти линейно с числом рёбер в графе.
Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.
allcycles(G,'MaxNumCycles',100) возвращает только первые 100 циклов в графике.'MaxNumCycles' - Максимальное количество цикловМаксимальное количество циклов, указанное как разделенная запятыми пара, состоящая из 'MaxNumCycles' и неотрицательный целочисленный скаляр. Эта опция полезна, когда число циклов в графике растет достаточно велико, чтобы достичь пределов памяти. Можно указать MaxNumCycles для ограничения количества циклов, возвращаемых allcycles чтобы результаты умещались в доступной памяти.
Пример: allcycles(G,'MaxNumCycles',100)
'MaxCycleLength' - Максимальная длина циклаМаксимальная длина цикла, указанная как разделенная запятыми пара, состоящая из 'MaxCycleLength' и положительный целочисленный скаляр. Этот параметр фильтрует результаты, возвращенные allcycles чтобы не возвращались циклы с длиной больше указанного предела. Длина цикла измеряется количеством краев в нем, игнорируя веса краев.
Чтобы найти циклы с диапазоном длин, укажите оба 'MaxCycleLength' и 'MinCycleLength'. Чтобы найти циклы с точно заданной длиной, укажите одно и то же значение для обоих 'MaxCycleLength' и 'MinCycleLength'.
Пример: allcycles(G,'MaxCycleLength',4) возвращает циклы, длина которых меньше или равна 4.
Пример: allcycles(G,'MinCycleLength',3,'MaxCycleLength',5) возвращает циклы длиной 3, 4 или 5.
'MinCycleLength' - Минимальная продолжительность циклаМинимальная длина цикла, указанная как разделенная запятыми пара, состоящая из 'MinCycleLength' и положительный целочисленный скаляр. Этот параметр фильтрует результаты, возвращенные allcycles чтобы не возвращались циклы с длиной меньше указанного предела. Длина цикла измеряется количеством краев в нем, игнорируя веса краев.
Чтобы найти циклы с диапазоном длин, укажите оба 'MaxCycleLength' и 'MinCycleLength'. Чтобы найти циклы с точно заданной длиной, укажите одно и то же значение для обоих 'MaxCycleLength' и 'MinCycleLength'.
Пример: allcycles(G,'MinCycleLength',2) возвращает циклы, длина которых больше или равна 2.
Пример: allcycles(G,'MinCycleLength',3,'MaxCycleLength',5) возвращает циклы длиной 3, 4 или 5.
cycles - Циклы графикаЦиклы графика, возвращаемые в виде массива ячеек. Каждый элемент cycles{k} содержит узлы, принадлежащие одному из циклов в G. Каждый цикл начинается с узла, имеющего наименьший индекс узла, и циклы возвращаются в лексикографическом порядке. Циклы в неориентированных графиках возвращаются только один раз, следуя одному направлению. Если G не содержит циклов, то cycles пуст.
Тип данных ячеек в cycles зависит от того, содержит ли входной граф имена узлов:
Если график G не имеет имен узлов, то каждый элемент cycles{k} - числовой вектор индексов узлов.
Если график G имеет имена узлов, затем каждый элемент cycles{k} - массив ячеек имен узлов символьных векторов.
edgecycles - Кромки в каждом циклеРебра в каждом цикле, возвращаемые в виде массива ячеек. Каждый элемент edgecycles{k} содержит индексы ребер для ребер в соответствующем цикле, cycles{k}. Если G не содержит циклов, то edgecycles пуст.
Цикл существует в графе, когда существует непустой путь, в котором повторяются только первый и последний узлы. Примером цикла является: (Node1 - Node2 - Node3 - Node1). По конвенции, allcycles не возвращает последний узел в цикле, так как он совпадает с первым.
Цикл не может пересекать одну и ту же кромку дважды. Например, цикл (Node1 - Node2 - Node1) в неориентированном графе существует только при наличии более одного ребра, связывающего Node1 и Node2. По этому определению самокольцы считаются циклами, хотя они не могут быть частью большего цикла.
Количество циклов в графе сильно зависит от структуры графа. Для некоторых структур графов число циклов может увеличиваться экспоненциально с числом узлов. Например, полный граф с 12 узлами, заданными G = graph(ones(12)) содержит почти 60 миллионов циклов. Используйте MaxNumCycles, MaxCycleLength, и MinCycleLength опции для управления выводом allcycles в этих случаях.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.