В этом примере показано, как сгенерировать код, который строит распределение вероятности к выборочным данным и вычисляет подходящее распределение.
Во-первых, задайте функцию точки входа, которая использует fitdist
чтобы создать объект вероятностного распределения и использование, его объект функционирует, чтобы вычислять подходящее распределение. Затем сгенерируйте код для функции точки входа при помощи codegen
. Функция точки входа может иметь объект вероятностного распределения и как входной параметр и как выходной аргумент. Поэтому альтернативно можно задать две функции точки входа, один для подбора кривой распределению и другому для того, чтобы вычислять подходящее распределение. Первая функция точки входа возвращает подходящее распределение, и вторая функция точки входа принимает подходящее распределение как входной параметр. Этот пример сначала описывает рабочий процесс с одной функцией точки входа, и затем кратко описывает рабочий процесс с двумя функциями точки входа.
fitdist
генерация кода поддержек для беты, экспоненциала, экстремума, логарифмически нормального, нормального, и распределения Weibull. Поддерживаемые объектные функции подходящих объектов вероятностного распределения, созданных fitdist
, cdf
, icdf
iqr
среднее значение
медиана
, 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-функции возвращают те же выходные параметры.
BetaDistribution
| ExponentialDistribution
| ExtremeValueDistribution
| LognormalDistribution
| NormalDistribution
| WeibullDistribution
| codegen
| fitdist