当前位置:网站首页>【數模】Matlab allcycles()函數的源代碼(2021a之前版本沒有)

【數模】Matlab allcycles()函數的源代碼(2021a之前版本沒有)

2022-07-07 04:40:00 Dream of Grass

Matlaballcycles()函數的源代碼

在之前的這篇博文裏用程序求出有向圖的所有有向圈(有向環)並可視化中用到了一個allcycles函數,這個函數只有2021a才有,如果matlab版本不高就用不了這個函數,所以為了方便大家使用,我把allcycles的內置函數找到然後分享給大家。

function [cycles, edgecycles] = allcycles(G, varargin)
% ALLCYCLES Compute all cycles in digraph
%   CYCLES = ALLCYCLES(G) computes all the cycles in digraph G. CYCLES is a
%   cell array in which CYCLES{
    i} is a vector of numeric node IDs (if G
%   does not have node names) or a cell array of character vectors (if G
%   has node names). Each cycle in CYCLES begins with the smallest node
%   index. If G is acyclic, then CYCLES is empty. The cycles are in
%   lexicographical order.
%
%   [CYCLES, EDGECYCLES] = ALLCYCLES(G) also returns a cell array
%   EDGECYCLES in which EDGECYCLES{
    i} contains the edges on the cycle
%   CYCLES{
    i} of G.
%
%   [...] = ALLCYCLES(G, Name, Value) specifies one or more additional
%   options using name-value pair arguments. The available options are:
%
%         'MaxNumCycles' - A scalar that specifies the maximum number
%                          of cycles in the output.
%       'MaxCycleLength' - A scalar that specifies the maximum cycle
%                          length of cycles in the output.
%       'MinCycleLength' - A scalar that specifies the minimum cycle
%                          length of cycles in the output.
%
%   See also ISDAG, HASCYCLES, CYCLEBASIS, ALLPATHS

%   Copyright 2020-2021 The MathWorks, Inc.
%
%   Reference:
%   Johnson, Donald B. "Finding all the elementary circuits of a directed
%   graph." SIAM Journal on Computing 4.1 (1975): 77-84.

[maxNumCycles, maxCycleLength, minCycleLength] = parseInputs(varargin{
    :});

if maxCycleLength < minCycleLength
    cycles = cell(0, 1);
    edgecycles = cell(0, 1);
    return
end

try
    if nargout < 2
        cycles = allSimpleCycles(G.Underlying, maxNumCycles, maxCycleLength,...
            minCycleLength);
    else
        [cycles, edgecycles] = allSimpleCycles(G.Underlying, maxNumCycles,...
            maxCycleLength, minCycleLength);
    end
catch e
    if e.identifier == "MATLAB:nomem"
        error(message('MATLAB:graphfun:allcycles:nomem'));
    else
        rethrow(e);
    end
end

[names, hasNodeNames] = getNodeNames(G);
names = names.';
if hasNodeNames
    for i = 1:size(cycles, 1)
        cycles{
    i} = names(cycles{
    i});
    end
end
end

function [maxNumCycles, maxCycleLength, minCycleLength] = parseInputs(varargin)
names = {
    'MaxNumCycles', 'MaxCycleLength', 'MinCycleLength'};
maxNumCycles = Inf;
maxCycleLength = Inf;
minCycleLength = 1;
for i = 1:2:numel(varargin)
    opt = validatestring(varargin{
    i}, names);
    if i+1 > numel(varargin)
        error(message('MATLAB:graphfun:allcycles:KeyWithoutValue', opt));
    end
    switch opt
        case 'MaxNumCycles'
            maxNumCycles = varargin{
    i+1};
            validateattributes(maxNumCycles, {
    'numeric'}, {
    'scalar', 'real', 'nonnegative', 'integer'}, '', 'MaxNumCycles')
        case 'MaxCycleLength'
            maxCycleLength = varargin{
    i+1};
            validateattributes(maxCycleLength, {
    'numeric'}, {
    'scalar', 'real', 'positive', 'integer'}, '', 'MaxCycleLength')
        case 'MinCycleLength'
            minCycleLength = varargin{
    i+1};
            validateattributes(minCycleLength, {
    'numeric'}, {
    'scalar', 'real', 'positive', 'integer'}, '', 'MinCycleLength')
    end
end
end

做一點點小說明

計算有向圖中的所有周期

CYCLES = ALLCYCLES(G)計算有向圖G中的所有周期

單元格數組,其中CYCLES{ i}是一個數值節點id的向量(如果G

沒有節點名稱)或字符向量的單元格數組(如果G

節點名稱)。 CYCLES中的每個周期都從最小的節點開始

索引。 如果G是無環的,那麼CYCLES為空。 周期在

辭典編纂的秩序。

[CYCLES, EDGECYCLES] = ALLCYCLES(G)也返回一個單元格數組

EDGECYCLES,其中EDGECYCLES{ i}包含循環上的邊

周期{我}的G。

[… = ALLCYCLES(G, Name, Value)指定一個或多個附加值

使用名稱-值對參數的選項。 可用選項有:

MaxNumCycles-一個指定最大數目的標量

輸出的周期。

MaxCycleLength-一個指定最大周期的標量

輸出中的周期長度。

MinCycleLength -一個指定最小周期的標量

輸出中的周期長度。

原网站

版权声明
本文为[Dream of Grass]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207062213328165.html

随机推荐