exponenta event banner

samplefun

Класс: matlab.unittest.measurement.MeasureResult
Пакет: 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 или false. tf является 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