samplefun

Класс: matlab.unittest.measurement.MeasurementResult
Пакет: matlab.unittest.measurement

Примените функцию через выборки MeasurementResult массив

Синтаксис

[B1,...,Bm] = samplefun(fh,R)
[B1,...,Bm] = samplefun(fh,R,'UniformOutput',tf)

Описание

[B1,...,Bm] = samplefun(fh,R) применяет функциональный fh через выборки на каждом элементе MeasurementResult массив. Каждый выходной аргумент от samplefun соответствует выходному аргументу от fh и имеет тот же размер и форму как R.

[B1,...,Bm] = samplefun(fh,R,'UniformOutput',tf) указывает если выход fh может быть возвращен без инкапсуляции в массиве ячеек. По умолчанию, fh должен возвратить скалярные значения, которые могут быть конкатенированы в массив.

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

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

Функция, чтобы применяться через выборки на каждый элемент MeasurementResult массив в виде указателя на функцию.

Результаты выполнения измерения экспериментируют на тестовом наборе в виде MeasurementResult массив.

Индикатор, ли fh возвращает универсальные значения в виде true или falsetf true по умолчанию, который указывает на тот fh возвращает скалярные значения, которые могут быть конкатенированы в массив. Если tf false, выходные параметры fh может иметь различные размеры и типы данных. samplefun возвращает эти неоднородные выходные параметры в массиве ячеек.

Примеры

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

В вашей текущей рабочей папке создайте основанный на классах тест, preallocationTest.m, это сравнивает различные методы предварительного выделения.

classdef preallocationTest < matlab.perftest.TestCase
    methods(Test)
        function testOnes(testCase)
            x = ones(1,1e7);
        end
        
        function testIndexingWithVariable(testCase)
            id = 1:1e7;
            x(id) = 1;
        end
        
        function testIndexingOnLHS(testCase)
            x(1:1e7) = 1;
        end
        
        function testForLoop(testCase)
            for i=1:1e7
                x(i) = 1;
            end
        end
        
    end
end

Создайте тестовый набор.

suite = testsuite('preallocationTest');

Создайте переменный эксперимент времени и запустите тесты.

import matlab.perftest.TimeExperiment
experiment = TimeExperiment.limitingSamplingError;
R = run(experiment,suite);
Running preallocationTest
..........
..........
..........
......Warning: Target Relative Margin of Error not met after running the MaxSamples
for preallocationTest/testOnes. 
....
..........
..........
..........
..........
.....
Done preallocationTest
__________

Для каждого тестового элемента найдите среднее время выборок.

M = samplefun(@mean,R)
M =

    0.0350    0.1351    0.0789    0.7337

Для каждого тестового элемента найдите минимальное время и индекс к минимальному времени.

[M,I] = samplefun(@min,R)
M =

    0.0258    0.1169    0.0691    0.6531


I =

    27     3     1     1

В вашей текущей рабочей папке создайте основанный на классах тест, preallocationTest.m, это сравнивает различные методы предварительного выделения.

classdef preallocationTest < matlab.perftest.TestCase
    methods(Test)
        function testOnes(testCase)
            x = ones(1,1e7);
        end
        
        function testIndexingWithVariable(testCase)
            id = 1:1e7;
            x(id) = 1;
        end
        
        function testIndexingOnLHS(testCase)
            x(1:1e7) = 1;
        end
        
        function testForLoop(testCase)
            for i=1:1e7
                x(i) = 1;
            end
        end
        
    end
end

Создайте тестовый набор.

suite = testsuite('preallocationTest');

Создайте фиксированный эксперимент времени с 26 демонстрационными измерениями и запустите тесты.

import matlab.perftest.TimeExperiment
experiment = TimeExperiment.withFixedSampleSize(26);
R = run(experiment,suite);
Running preallocationTest
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
....
Done preallocationTest
__________

В вашей текущей рабочей папке создайте функцию, customSampleFun, это вычисляет среднее значение каждой из этих 26 выборок, преобразует среднее значение в миллисекунды и возвращает вектор символов, указывающий, было ли среднее время быстрым или медленным.

function [mean_ms,speed] = customSampleFun(S)
threshold_ms = 100;
mean_ms = mean(S)*1e3;
if mean_ms < threshold_ms
    speed = 'fast';
else
    speed = 'slow';
end
end

Примените customSampleFun к каждому элементу в MeasurementResult массив. Поскольку векторы символов не являются скаляром, задают UniformOutput как ложь.

[mean_ms,speed] = samplefun(@customSampleFun,R,'UniformOutput',false)
mean_ms =

  1×4 cell array

    [30.9500]    [142.7037]    [83.9830]    [806.3446]


speed =

  1×4 cell array

    'fast'    'slow'    'fast'    'slow'

Смотрите также

Введенный в R2017a