В этом примере показано, как создать код, который соответствует вероятностному распределению для выборки данных и оценивает соответствующее распределение.
Сначала определите функцию точки входа, использующую fitdist для создания объекта распределения вероятностей и использует его объектные функции для оценки подобранного распределения. Затем создайте код для функции точки входа с помощью codegen (Кодер MATLAB). Функция точки входа может иметь объект распределения вероятности как входной аргумент, так и выходной аргумент. Таким образом, в качестве альтернативы можно определить две функции точки входа: одну для подгонки распределения и другую для оценки подгоняемого распределения. Первая функция точки входа возвращает аппроксимированное распределение, а вторая функция точки входа принимает аппроксимированное распределение в качестве входного аргумента. В этом примере сначала описывается рабочий процесс с одной функцией точки входа, а затем кратко описывается рабочий процесс с двумя функциями точки входа.
fitdist поддерживает генерацию кода для бета, экспоненциальных, экстремальных значений, логнормальных, нормальных и Вейбулловых распределений. Поддерживаемые объектные функции подогнанных объектов распределения вероятностей, созданные fitdistявляются cdf, icdf, iqr, mean, median, pdf, std, 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).
Если требуется указать ARGS{1} и ARGS{3} в качестве входных данных переменного размера, coder.typeof (Кодер MATLAB). Дополнительные сведения см. в разделе Общий рабочий процесс создания кода.
Создание функции MEX из функции точки входа myFitandEvaluate. Укажите типы входных аргументов с помощью -args параметр и массив ячеек ARGS.
codegen myFitandEvaluate -args ARGS
Code generation successful.
codegen (Кодер MATLAB) генерирует функцию 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 возвращает логический 1 (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.OutputType (MATLAB Coder) при генерации функции MEX, поскольку тип данных вывода из myFitDist не соответствует типу данных ввода для myEvaluateDist в сгенерированной функции MEX.
Создайте код для двух функций точки входа.
codegen -o myFitandEvaluate_mex2 myFitDist -args ARGS_myFitDist myEvaluateDist -args ARGS_myEvaluateDist
Code generation successful.
codegen (Кодер MATLAB) генерирует функцию MEX myFitandEvaluate_mex2. Дополнительные сведения о создании кода для нескольких функций точки входа см. в разделе Создание кода для нескольких функций точки входа (кодер MATLAB).
Проверьте созданный код.
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 возвращает логический 1 (true), что означает, что функции начальной точки и соответствующие функции MEX возвращают одни и те же выходные сигналы.
BetaDistribution | ExponentialDistribution | ExtremeValueDistribution | fitdist | LognormalDistribution | NormalDistribution | WeibullDistribution | codegen (кодер MATLAB)