这个例子展示了如何生成代码,使样本数据符合概率分布,并对符合的分布进行评估。
首先,定义一个入口点函数fitdist
创建一个概率分布对象,并使用其目标函数来评估拟合的分布。然后,使用codegen
(MATLAB编码器).一个入口点函数可以有一个概率分布对象作为输入参数和输出参数。因此,您可以定义两个入口点函数,一个用于拟合分布,另一个用于评估拟合分布。第一个入口点函数返回一个拟合分布,第二个入口点函数接受这个拟合分布作为输入参数。这个例子首先描述了一个单入口点函数的工作流,然后简要描述了两个入口点函数的工作流。
fitdist
金宝app支持生成beta、指数、极值、对数正态、正态和Weibull分布的代码。拟合概率金宝app分布对象的支持对象函数,由fitdist
,都是提供
,icdf
,位差
,的意思是
,中位数
,pdf
,性病
,截断
,var
.
有关代码生成的更多信息,请参见通用代码生成工作流.
定义一个入口点函数名为myFitandEvaluate
它使用样本数据、分布名称、分布的截断限制和用于评估累积分布函数(cdf)和概率密度函数(pdf)的数据值。在入口点函数中,拟合一个概率分布对象到样本数据,将分布截断到指定的截断极限,计算截断分布的均值,并在指定的数据值处计算cdf和pdf值。
显示的内容myFitandEvaluate.m
文件。
类型myFitandEvaluate.m
function [pd_truncated,st] = myFitandEvaluate(data,distname,truncation_limits,x) %#codegen %将概率分布对象匹配到data中。pd = fitdist(数据、distname);%截断pd。pd_truncated =截断(pd, truncation_limits (1) truncation_limits (2));%计算截断pd的平均值。mean_val =意味着(pd_truncated);%计算cdf和pdf,在x. cdf_val = cdf(pd_truncated,x);pdf_val = pdf (pd_truncated x);%创建一个包含平均值、cdf和pdf值的结构数组。mean_val圣=结构(“的意思是”,“提供”,cdf_val, pdf, pdf_val); end
注意:如果你点击这个页面右上角的按钮并在MATLAB®中打开这个示例,那么MATLAB就会打开示例文件夹。这个文件夹包含了这个示例的入口点函数文件。
的输入参数类型myFitandEvaluate
使用4 × 1单元阵列。将入口点函数的每个输入参数类型分配给每个单元格。使用表示具有特定数据类型和数组大小的值集的示例值,指定数据类型和准确的输入数组大小。
ARGS =细胞(4,1);ARGS {1} = 1 (100 1);ARGS{2} =编码器。常数(“指数”);的参数{3}=(1、2);ARGS {4} = 1 (10, 1);
第二个输入myFitandEvaluate
是一个分布名称,它是第二个输入参数fitdist
.这个参数必须是一个编译时常量。因此,您指定ARGS {2}
通过使用编码器。常数
(MATLAB编码器).
如果你想指定ARGS {1}
和ARGS {3}
作为可变大小的输入,使用coder.typeof
(MATLAB编码器).有关详细信息,请参见通用代码生成工作流.
从入口点函数生成MEX函数myFitandEvaluate
.属性指定输入参数类型arg游戏
选项和单元格数组arg游戏
.
codegenmyFitandEvaluatearg游戏arg游戏
代码生成成功。
codegen
(MATLAB编码器)生成MEX函数myFitandEvaluate_mex
使用当前文件夹中与平台相关的扩展名。
传递一些数据来验证是否myFitandEvaluate
和myFitandEvaluate_mex
返回相同的输出。
rng (“默认”)%的再现性data = exprnd(1,[1] 100年);指数随机数与平均参数1distname =“指数”;truncation_limits = [0, 4];x =(0:9)”;[pd_truncated、圣]= myFitandEvaluate(数据、distname truncation_limits x);[pd_truncated_mex, st_mex] = myFitandEvaluate_mex(数据、distname truncation_limits x);
比较概率分布对象pd_truncated
和pd_truncated_mex
.
pd_truncated
pd_truncated = ExponentialDistribution指数分布mu = 0.917049截断到区间[0,4]
pd_truncated_mex
pd_truncated_mex = ExponentialDistribution指数分布mu = 0.917049截断到区间[0,4]
verifyMEX_pd = isequal (pd_truncated pd_truncated_mex)
verifyMEX_pd =逻辑1
isequal
返回逻辑1 (真正的
),这意味着pd_truncated
和pd_truncated_mex
是相等的。
比较包含平均值、cdf和pdf值的结构数组。
st_mex verifyMEX_st = isequal(圣)
verifyMEX_st =逻辑1
对比证实了myFitandEvaluate
和myFitandEvaluate_mex
返回相同的输出。生成的代码可能不会产生与MATLAB相同的浮点数值结果,如生成代码与MATLAB代码的区别(MATLAB编码器).在这种情况下,比较允许小公差的值。
一个入口点函数可以有一个概率分布对象作为输入参数和输出参数。因此,您可以定义两个入口点函数,一个用于拟合分布,另一个用于评估拟合分布。然后为两个入口点函数生成代码。
定义两个入口点函数。第一个入口点函数myFitDist
将概率分布对象拟合到样本数据中。第二个入口点函数myEvaluateDist
截断分布,计算截断分布的平均值,并在指定的数据值处计算CDF和PDF值。myEvaluateDist
的输出myFitDist
作为输入参数。
显示的内容myFitDist.m
和myEvaluateDist.m
文件。
类型myFitDist.m
函数pd = myFitDist(data,dist) %#codegen %拟合概率分布对象到数据。pd = fitdist(数据、区域);结束
类型myEvaluateDist.m
function [pd_truncated,st] = myEvaluateDist(pd,truncation_limits,x) %#codegen % Truncate pd. log(删除文件)pd_truncated =截断(pd, truncation_limits (1) truncation_limits (2));%计算截断pd的平均值。mean_val =意味着(pd_truncated);%计算cdf和pdf,在x. cdf_val = cdf(pd_truncated,x);pdf_val = pdf (pd_truncated x);%创建一个包含平均值、cdf和pdf值的结构数组。mean_val圣=结构(“的意思是”,“提供”,cdf_val, pdf, pdf_val);结束
的输入参数类型myFitDist
和myEvaluateDist
.
ARGS_myFitDist =细胞(2,1);ARGS_myFitDist {1} = 1 (100 1);ARGS_myFitDist{2} =编码器。常数(“指数”);ARGS_myEvaluateDist =细胞(3,1);ARGS_myEvaluateDist {1} = fitdist (exprnd(1,[1] 100年),“指数”);ARGS_myEvaluateDist{2} = 1(1、2);ARGS_myEvaluateDist {3} = 1 (10, 1);
如果不需要生成MEX函数,则可以指定ARGS_myEvaluateDist {1}
作为coder.OutputType(“myFitdist”)
,如传递一个入口点函数输出作为输入(MATLAB编码器).你不能使用编码器。OutputType
(MATLAB编码器)在生成MEX函数时,因为myFitDist
与输入的数据类型不匹配myEvaluateDist
在生成的MEX函数中。
为两个入口点函数生成代码。
codegen- omyFitandEvaluate_mex2myFitDistarg游戏ARGS_myFitDistmyEvaluateDistarg游戏ARGS_myEvaluateDist
代码生成成功。
codegen
(MATLAB编码器)生成MEX函数myFitandEvaluate_mex2
.有关为多个入口点函数生成代码的详细信息,请参见为多个入口点函数生成代码(MATLAB编码器).
验证生成的代码。
rng (“默认”)数据= expr (1,[100,1]);distname =“指数”;truncation_limits = [0, 4];x =(0:9)”;pd2 = myFitDist(数据、distname);[pd_truncated2, st2] = myEvaluateDist (pd2 truncation_limits x);pd_mex2 = myFitandEvaluate_mex2 (“myFitDist”、数据distname);[pd_truncated_mex2, st_mex2] = myFitandEvaluate_mex2 (“myEvaluateDist”pd_mex2 truncation_limits, x);verifyMEX_pd2 = isequal (pd2 pd_mex2)
verifyMEX_pd2 =逻辑1
verifyMEX_pd_truncated2 = isequal (pd_truncated2 pd_truncated_mex)
verifyMEX_pd_truncated2 =逻辑1
verifyMEX_st2 = isequal (st2 st_mex2)
verifyMEX_st2 =逻辑1
isequal
返回逻辑1 (真正的
),这意味着入口点函数和相应的MEX函数返回相同的输出。
codegen
(MATLAB编码器)|fitdist
|BetaDistribution
|ExponentialDistribution
|ExtremeValueDistribution
|LognormalDistribution
|NormalDistribution
|WeibullDistribution