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 или 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