• 【数模】Matlab allcycles()函数的源代码(2021a之前版本没有)


    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    做一点点小说明

    计算有向图中的所有周期

    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 -一个指定最小周期的标量

    输出中的周期长度。

  • 相关阅读:
    初步了解Vite
    快速构建Spring boot项目
    如果项目上线出现bug,测试人员该怎么办?
    力扣每日一题:1742. 盒子中小球的最大数量
    白盒测试总结
    Python Connect SQLServer 2008
    禁止ie自动跳转edge
    matlab创建矩阵、理解三维矩阵
    只要一个软件,就能满足移动数据分析的所有需求!
    Android开源 日志框架 LogDog V2.3.1
  • 原文地址:https://blog.csdn.net/dream_of_grass/article/details/125631755