samplefun

Класс: matlab.unittest.measurement.
Пакет: 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.

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

Примеры

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

В вашей текущей рабочей папке создайте основанный на классах тест, 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