алгоритм

Класс: slmetric.metric. Метрика
Пакет: slmetric.metric

Задайте логику для метрического анализа данных

Синтаксис

Result = algorithm(Metric,Component)

Описание

Задайте логику для метрического анализа алгоритма. Пользовательски созданные метрические алгоритмы не называются для ссылок библиотеки и внешних компонентов файла MATLAB.

пример

Result = algorithm(Metric,Component) задает логику для метрического анализа алгоритма.

Входные параметры

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

Образцовый метрический класс вы задаете для новой метрики.

Экземпляр Advisor.component.Component для метрического анализа.

Выходные аргументы

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

Данные об алгоритме, возвращенные как массив объектов slmetric.metric.Result.

Примеры

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

Этот пример показывает, как использовать метод algorithm, чтобы создать невиртуальную метрику количества блока.

Используя функцию createNewMetricClass, создайте метрический класс с именем nonvirtualblockcount. Функция создает файл nonvirtualblockcount.m в текущей рабочей папке.

className = 'nonvirtualblockcount'; 
slmetric.metric.createNewMetricClass(className);

Откройте и отредактируйте метрический файл алгоритма nonvirtualblockcount.m. Файл содержит пустой метрический метод алгоритма.

edit(className);

Скопируйте и вставьте следующий код в файл nonvirtualblockcount.m. Сохраните nonvirtualblockcount.m. Код предоставляет метрический алгоритм для подсчета невиртуальных блоков.

classdef nonvirtualblockcount < slmetric.metric.Metric
    % nonvirtualblockcount calculate number of non-virtual blocks per level.
    % BusCreator, BusSelector and BusAssign are treated as non-virtual.
    properties
        VirtualBlockTypes = {'Demux','From','Goto','Ground', ...
            'GotoTagVisiblity','Mux','SignalSpecification', ...
            'Terminator','Inport'};
    end
    
    methods
    function this = nonvirtualblockcount()
        this.ID = 'nonvirtualblockcount';
        this.Version = 1;
        this.CompileContext = 'None';
        this.Description = 'Algorithm that counts nonvirtual blocks per level.';
        this.ComponentScope = [Advisor.component.Types.Model, ...
            Advisor.component.Types.SubSystem];
    end

    function res = algorithm(this, component)
        % create a result object for this component
        res = slmetric.metric.Result();	

        % set the component and metric ID
        res.ComponentID = component.ID;
        res.MetricID = this.ID;

        % use find_system to get all blocks inside this component
        blocks = find_system(getComponentSource(component), ...
            'FollowLinks','on', 'SearchDepth', 1, ...
            'Type', 'Block', ...
            'FollowLinks', 'On');

        isNonVirtual = true(size(blocks));

        for n=1:length(blocks)
            blockType = get_param(blocks{n}, 'BlockType');

            if any(strcmp(this.VirtualBlockTypes, blockType))
                isNonVirtual(n) = false;
            else
                switch blockType
                    case 'SubSystem'
                        % Virtual unless the block is conditionally executed
                        % or the Treat as atomic unit check box is selected.
                        if strcmp(get_param(blocks{n}, 'IsSubSystemVirtual'), ...
                                'on')
                            isNonVirtual(n) = false;
                        end
                    case 'Outport'
                        % Outport: Virtual when the block resides within
                        % any SubSystem block (conditional or not), and 
                        % does not reside in the root (top-level) Simulink window.
                        if component.Type ~= Advisor.component.Types.Model
                            isNonVirtual(n) = false;
                        end
                    case 'Selector'
                        % Virtual only when Number of input dimensions 
                        % specifies 1 and Index Option specifies Select 
                        % all, Index vector (dialog), or Starting index (dialog).
                        nod = get_param(blocks{n}, 'NumberOfDimensions');
                        ios = get_param(blocks{n}, 'IndexOptionArray');

                        ios_settings = {'Assign all', 'Index vector (dialog)', ...
                            'Starting index (dialog)'};

                        if nod == 1 && any(strcmp(ios_settings, ios))
                            isNonVirtual(n) = false;
                        end
                    case 'Trigger'
                        % Virtual when the output port is not present.
                        if strcmp(get_param(blocks{n}, 'ShowOutputPort'), 'off')
                            isNonVirtual(n) = false;
                        end
                    case 'Enable'
                        % Virtual unless connected directly to an Outport block.
                        isNonVirtual(n) = false;

                        if strcmp(get_param(blocks{n}, 'ShowOutputPort'), 'on')
                            pc = get_param(blocks{n}, 'PortConnectivity');

                            if ~isempty(pc.DstBlock) && ...
                                    strcmp(get_param(pc.DstBlock, 'BlockType'), ...
                                    'Outport')
                                isNonVirtual(n) = true;
                            end
                        end
                end
            end
        end

        blocks = blocks(isNonVirtual);

        res.Value = length(blocks);
    end
    end
end

Введенный в R2016a