В этом примере показано, как сгенерировать код, который строит распределение вероятности к выборочным данным и вычисляет подходящее распределение.
Во-первых, задайте функцию точки входа, которая использует fitdist чтобы создать объект вероятностного распределения и использование, его объект функционирует, чтобы вычислять подходящее распределение. Затем сгенерируйте код для функции точки входа при помощи codegen (MATLAB Coder). Функция точки входа может иметь объект вероятностного распределения и как входной параметр и как выходной аргумент. Поэтому альтернативно можно задать две функции точки входа, один для подбора кривой распределению и другому для того, чтобы вычислять подходящее распределение. Первая функция точки входа возвращает подходящее распределение, и вторая функция точки входа принимает подходящее распределение как входной параметр. Этот пример сначала описывает рабочий процесс с одной функцией точки входа, и затем кратко описывает рабочий процесс с двумя функциями точки входа.
fitdist генерация кода поддержек для беты, экспоненциала, экстремума, логарифмически нормального, нормального, и распределения Weibull. Поддерживаемые объектные функции подходящих объектов вероятностного распределения, созданных fitdist, cdf, icdfiqrсреднее значениемедиана, pdfстанд, truncate, и var.
Для получения дополнительной информации о генерации кода смотрите Общий Рабочий процесс Генерации кода.
Задайте функцию с именем точки входа myFitandEvaluate это берет выборочные данные, имя распределения, пределы усечения распределения и значения данных, при которых можно оценить кумулятивную функцию распределения (cdf) и функцию плотности вероятности (PDF). В функции точки входа соответствуйте объекту вероятностного распределения к выборочным данным, обрежьте распределение до заданных пределов усечения, вычислите среднее значение усеченного распределения и вычислите cdf и значения PDF в заданных значениях данных.
Отобразите содержимое myFitandEvaluate.m файл.
type myFitandEvaluate.mfunction [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 (MATLAB Coder).
Если вы хотите задать ARGS{1} и ARGS{3} когда переменный размер вводит, используйте coder.typeof (MATLAB Coder). Для получения дополнительной информации смотрите Общий Рабочий процесс Генерации кода.
Сгенерируйте MEX-функцию от функции точки входа myFitandEvaluate. Задайте типы входного параметра с помощью -args опция и массив ячеек ARGS.
codegen myFitandEvaluate -args ARGS
Code generation successful.
codegen (MATLAB Coder) генерирует 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.mfunction pd = myFitDist(data,dist) %#codegen % Fit probability distribution object to data. pd = fitdist(data,dist); end
type myEvaluateDist.mfunction [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 (MATLAB Coder) при генерации MEX-функции, потому что тип данных выхода от myFitDist не совпадает с типом данных входа к myEvaluateDist в сгенерированной MEX-функции.
Сгенерируйте код для двух функций точки входа.
codegen -o myFitandEvaluate_mex2 myFitDist -args ARGS_myFitDist myEvaluateDist -args ARGS_myEvaluateDist
Code generation successful.
codegen (MATLAB Coder) генерирует 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 | fitdist | LognormalDistribution | NormalDistribution | WeibullDistribution | codegen (MATLAB Coder)