Генерация кода для Объектов Распределения вероятностей

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

Во-первых, задайте функцию точки входа, которая использует fitdist чтобы создать объект вероятностного распределения и использование, его объект функционирует, чтобы вычислять подходящее распределение. Затем сгенерируйте код для функции точки входа при помощи codegen. Функция точки входа может иметь объект вероятностного распределения и как входной параметр и как выходной аргумент. Поэтому альтернативно можно задать две функции точки входа, один для подбора кривой распределению и другому для того, чтобы вычислять подходящее распределение. Первая функция точки входа возвращает подходящее распределение, и вторая функция точки входа принимает подходящее распределение как входной параметр. Этот пример сначала описывает рабочий процесс с одной функцией точки входа, и затем кратко описывает рабочий процесс с двумя функциями точки входа.

fitdist генерация кода поддержек для беты, экспоненциала, экстремума, логарифмически нормального, нормального, и распределения Weibull. Поддерживаемые объектные функции подходящих объектов вероятностного распределения, созданных fitdist, cdf, icdfiqrсреднее значениемедиана, pdfстанд, truncate, и var.

Для получения дополнительной информации о генерации кода смотрите Общий Рабочий процесс Генерации кода.

Задайте функцию точки входа

Задайте функцию с именем точки входа myFitandEvaluate это берет выборочные данные, имя распределения, пределы усечения распределения и значения данных, при которых можно оценить кумулятивную функцию распределения (cdf) и функцию распределения вероятностей (PDF). В функции точки входа соответствуйте объекту вероятностного распределения к выборочным данным, обрежьте распределение до заданных пределов усечения, вычислите среднее значение усеченного распределения и вычислите cdf и значения PDF в заданных значениях данных.

Отобразите содержимое myFitandEvaluate.m файл.

type myFitandEvaluate.m
function [pd_truncated,st] = myFitandEvaluate(data,distname,truncation_limits,x) %#codegen
% Fit a probability distribution object to data.
pd = fitdist(data,distname);

% Truncate pd.
pd_truncated = truncate(pd,truncation_limits(1),truncation_limits(2));

% Compute the mean of the truncated pd.
mean_val = mean(pd_truncated);

% Compute the cdf and pdf, evaluated at x.
cdf_val = cdf(pd_truncated,x);
pdf_val = pdf(pd_truncated,x);

% Create a structure array containing the mean, cdf, and pdf values.
st = struct('mean', mean_val,'cdf',cdf_val,'pdf',pdf_val);
end

Примечание: Если вы нажимаете кнопку, расположенную в верхнем правом разделе этой страницы, и открываете этот пример в MATLAB®, затем MATLAB открывает папку в качестве примера. Эта папка включает файлы функции точки входа для этого примера.

Сгенерируйте код

Задайте типы входного параметра myFitandEvaluate использование 4 1 массива ячеек. Присвойте каждый тип входного параметра функции точки входа к каждой ячейке. Задайте тип данных и точный размер входного массива при помощи значения в качестве примера, которое представляет множество значений с определенным размером типа данных и массива.

ARGS = cell(4,1);
ARGS{1} = ones(100,1);
ARGS{2} = coder.Constant('Exponential');
ARGS{3} = ones(1,2);
ARGS{4} = ones(10,1);

Второй вход myFitandEvaluate имя распределения, которое является вторым входным параметром fitdist. Этот аргумент должен быть постоянным временем компиляции. Поэтому вы задаете ARGS{2} при помощи coder.Constant.

Если вы хотите задать ARGS{1} и ARGS{3} когда переменный размер вводит, используйте coder.typeof. Для получения дополнительной информации смотрите Общий Рабочий процесс Генерации кода.

Сгенерируйте MEX-функцию от функции точки входа myFitandEvaluate. Задайте типы входного параметра с помощью -args опция и массив ячеек ARGS.

codegen myFitandEvaluate -args ARGS

codegen генерирует MEX-функцию myFitandEvaluate_mex с зависимым платформой расширением в вашей текущей папке.

Проверьте сгенерированный код

Передайте некоторые данные, чтобы проверить ли myFitandEvaluate и myFitandEvaluate_mex возвратите те же выходные параметры.

rng('default') % For reproducibility
data = exprnd(1,[100,1]); % Exponential random numbers with mean parameter 1
distname = 'Exponential';
truncation_limits = [0,4];
x = (0:9)';
[pd_truncated,st] = myFitandEvaluate(data,distname,truncation_limits,x);
[pd_truncated_mex,st_mex] = myFitandEvaluate_mex(data,distname,truncation_limits,x);

Сравните вероятностное распределение возражает pd_truncated и pd_truncated_mex.

pd_truncated
pd_truncated = 
  ExponentialDistribution

  Exponential distribution
    mu = 0.917049
  Truncated to the interval [0, 4]

pd_truncated_mex
pd_truncated_mex = 
  ExponentialDistribution

  Exponential distribution
    mu = 0.917049
  Truncated to the interval [0, 4]

verifyMEX_pd = isequal(pd_truncated,pd_truncated_mex)
verifyMEX_pd = logical
   1

isequal возвращает логическую единицу (true), что означает pd_truncated и pd_truncated_mex равны.

Сравните массивы структур, которые содержат среднее значение, cdf, и значения PDF.

verifyMEX_st = isequal(st,st_mex)
verifyMEX_st = logical
   1

Сравнение подтверждает тот myFitandEvaluate и myFitandEvaluate_mex возвратите те же выходные параметры. Сгенерированный код не может привести к тем же числовым результатам с плавающей точкой как MATLAB, как описано в Различиях Между Сгенерированным кодом и кодом MATLAB (MATLAB Coder). В этом случае сравните значения, позволяющие маленький допуск.

Рабочий процесс с двумя функциями точки входа

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

Задайте функции точки входа

Задайте две функции точки входа. Первая точка входа функционирует myFitDist соответствует объекту вероятностного распределения к выборочным данным. Вторая точка входа функционирует myEvaluateDist обрезает распределение, вычисляет среднее значение усеченного распределения и вычисляет cdf и значения PDF в заданных значениях данных. myEvaluateDist берет выход myFitDist как входной параметр.

Отобразите содержимое myFitDist.m и myEvaluateDist.m файлы.

type myFitDist.m
function pd = myFitDist(data,dist) %#codegen
% Fit probability distribution object to data.
pd = fitdist(data,dist);
end
type myEvaluateDist.m
function [pd_truncated,st] = myEvaluateDist(pd,truncation_limits,x) %#codegen
% Truncate pd.
pd_truncated = truncate(pd,truncation_limits(1),truncation_limits(2));

% Compute the mean of the truncated pd.
mean_val = mean(pd_truncated);

% Compute the cdf and pdf, evaluated at x.
cdf_val = cdf(pd_truncated,x);
pdf_val = pdf(pd_truncated,x);

% Create a structure array containing the mean, cdf, and pdf values.
st = struct('mean', mean_val,'cdf',cdf_val,'pdf',pdf_val);
end

Сгенерируйте код

Задайте типы входного параметра myFitDist и myEvaluateDist.

ARGS_myFitDist = cell(2,1);
ARGS_myFitDist{1} = ones(100,1);
ARGS_myFitDist{2} = coder.Constant('Exponential');

ARGS_myEvaluateDist = cell(3,1);
ARGS_myEvaluateDist{1} = fitdist(exprnd(1,[100,1]),'Exponential');
ARGS_myEvaluateDist{2} = ones(1,2); 
ARGS_myEvaluateDist{3} = ones(10,1);

Если вы не должны генерировать MEX-функцию, то можно задать ARGS_myEvaluateDist{1} как coder.OutputType('myFitdist'), как описано в Передаче Функция Точки входа Выход как Вход (MATLAB Coder). Вы не можете использовать coder.OutputType при генерации MEX-функции, потому что тип данных выхода от myFitDist не совпадает с типом данных входа к myEvaluateDist в сгенерированной MEX-функции.

Сгенерируйте код для двух функций точки входа.

codegen -o myFitandEvaluate_mex2 myFitDist -args ARGS_myFitDist myEvaluateDist -args ARGS_myEvaluateDist

codegen генерирует MEX-функцию myFitandEvaluate_mex2. Для получения дополнительной информации о генерации кода для нескольких функций точки входа, смотрите, Генерируют Код для Нескольких Функций Точки входа (MATLAB Coder).

Проверьте сгенерированный код

Проверьте сгенерированный код.

rng('default') 
data = exprnd(1,[100,1]);
distname = 'Exponential';
truncation_limits = [0,4];
x = (0:9)';
pd2 = myFitDist(data,distname);
[pd_truncated2,st2] = myEvaluateDist(pd2,truncation_limits,x);
pd_mex2 = myFitandEvaluate_mex2('myFitDist',data,distname);
[pd_truncated_mex2,st_mex2] = myFitandEvaluate_mex2('myEvaluateDist',pd_mex2,truncation_limits,x);
verifyMEX_pd2 = isequal(pd2,pd_mex2)
verifyMEX_pd2 = logical
   1

verifyMEX_pd_truncated2 = isequal(pd_truncated2,pd_truncated_mex)
verifyMEX_pd_truncated2 = logical
   1

verifyMEX_st2 = isequal(st2,st_mex2)
verifyMEX_st2 = logical
   1

isequal возвращает логическую единицу (true), что означает, что функции точки входа и соответствующие MEX-функции возвращают те же выходные параметры.

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

| | | | | | |

Похожие темы