这个例子展示了如何产生一个适合的概率分布来采样数据,并评估拟合分布的代码。
首先,定义一个使用的入口点函数fitdist
创建一个概率分布对象,并使用其对象函数对拟合后的分布进行评估。然后,使用codegen
。一个入口点函数可以有一个概率分布对象作为输入参数和输出参数。因此,您也可以定义两个入口点函数,一个用于拟合分布,另一个用于评估拟合分布。第一个入口点函数返回一个拟合分布,第二个入口点函数接受这个拟合分布作为输入参数。这个例子首先用一个入口点函数描述工作流,然后用两个入口点函数简要描述工作流。
fitdist
万博1manbetx支持为beta、指数、极值、对数正态、正态和威布尔分布生成代码。所支持的万博1manbetx对象函数的拟合概率分布对象,由fitdist
,都是提供
,ICDF
,位差
,意思
,中位数
,PDF格式
,性病
,截短
和VAR
。
有关代码生成的更多信息,请参见通用代码生成工作流。
定义一个名为入口点函数myFitandEvaluate
它获取样本数据、分布名称、分布的截断限制以及用于评估累积分布函数(cdf)和概率分布函数(pdf)的数据值。在入口点函数中,将一个概率分布对象拟合到样本数据中,将分布截断到指定的截断极限,计算截断后分布的平均值,并在指定的数据值处计算cdf和pdf值。
控件的内容myFitandEvaluate.m
文件。
类型myFitandEvaluate.m
函数[pd_truncated,ST] = myFitandEvaluate(数据,DISTNAME,truncation_limits,X)%#代码生成适合%的概率分布对象数据。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值的结构阵列。 st = struct('mean', mean_val,'cdf',cdf_val,'pdf',pdf_val); end
注意:如果您单击位于此页面的右上部分的按钮,打开在MATLAB®这个例子中,然后打开MATLAB的示例文件夹中。这个文件夹包括了本例的入口点函数的文件。
指定输入参数类型myFitandEvaluate
使用4×1单元阵列。分配入口点函数到每个单元的每个输入参数类型。通过使用表示与特定的数据类型和阵列尺寸的设定值的一例的值指定数据类型和详细的输入数组大小。
ARGS =细胞(4,1);ARGS {1} =酮(100,1);ARGS {2} = coder.Constant(“指数”);ARGS {3} =酮(1,2);ARGS {4} =酮(10,1);
第二个输入myFitandEvaluate
是一个分布的名称,这是第二个输入参数fitdist
。此参数必须是一个编译时间常数。因此,您指定ARGS {2}
通过使用coder.Constant
。
如果你想指定ARGS {1}
和ARGS {3}
作为可变大小的输入,使用coder.typeof
。有关详细信息,请参阅通用代码生成工作流。
从入口点函数生成一个MEX函数myFitandEvaluate
。属性指定输入参数类型arg游戏
选项和单元阵列arg游戏
。
codegenmyFitandEvaluatearg游戏arg游戏
codegen
生成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指数分布亩= 0.917049截断为区间[0,4]
pd_truncated_mex
截断到区间[0,4]的指数分布
verifyMEX_pd = ISEQUAL(pd_truncated,pd_truncated_mex)
verifyMEX_pd =逻辑1
isequal
返回逻辑1(真正
), 意思是pd_truncated
和pd_truncated_mex
是相等的。
与此相比,包含的意思,CDF和PDF值结构数组。
verifyMEX_st = ISEQUAL(ST,st_mex)
verifyMEX_st =逻辑1
比较证实myFitandEvaluate
和myFitandEvaluate_mex
返回相同的输出。生成的代码可能不会产生浮点数字结果如MATLAB相同,如在生成的代码与MATLAB代码的区别(MATLAB编码器)。在这种情况下,比较允许小偏差的值。
一个入口点函数可以有一个概率分布对象作为输入参数和输出参数。因此,可以定义两个入口点函数,一个用于拟合分布,另一个用于评估拟合分布。然后为这两个入口点函数生成代码。
定义两个入口点函数。第一入口点函数myFitDist
适合的概率分布对象到样本数据。第二个入口点函数myEvaluateDist
截断的分布,计算平均值的截断分布的,并在指定的数据值计算CDF和pdf值。myEvaluateDist
需要的输出myFitDist
作为输入参数。
控件的内容myFitDist.m
和myEvaluateDist.m
文件。
类型myFitDist.m
功能PD = myFitDist(数据,DIST)%#代码生成%适合概率分布对象数据。PD = fitdist(数据,DIST);结束
类型myEvaluateDist.m
函数[pd_truncated,ST] = myEvaluateDist(PD,truncation_limits,X)%#代码生成%截断概率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值的结构阵列。ST =结构( '平均',mean_val, 'CDF',cdf_val, 'PDF',pdf_val);结束
指定输入参数类型myFitDist
和myEvaluateDist
。
ARGS_myFitDist =细胞(2,1);ARGS_myFitDist {1} =酮(100,1);ARGS_myFitDist {2} = coder.Constant(“指数”);ARGS_myEvaluateDist =细胞(3,1);ARGS_myEvaluateDist {1} = fitdist (exprnd(1,[1] 100年),“指数”);ARGS_myEvaluateDist {2} =酮(1,2);ARGS_myEvaluateDist {3} =酮(10,1);
如果不需要生成MEX函数,则可以指定ARGS_myEvaluateDist {1}
作为coder.OutputType( 'myFitdist')
,如在传递一个入口点函数的输出作为输入(MATLAB编码器)。您不能使用coder.OutputType
生成MEX功能时,因为从数据类型的输出myFitDist
输入的数据类型不匹配myEvaluateDist
在生成的MEX函数中。
为这两个入口点函数生成代码。
codegen-omyFitandEvaluate_mex2myFitDistarg游戏ARGS_myFitDistmyEvaluateDistarg游戏ARGS_myEvaluateDist
codegen
生成MEX函数myFitandEvaluate_mex2
。有关生成多个入口点函数的代码的详细信息,请参阅为多个入口点函数生成代码(MATLAB编码器)。
验证生成的代码。
RNG('默认') data = exprnd(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函数返回相同的输出。
BetaDistribution
|ExponentialDistribution
|ExtremeValueDistribution
|LognormalDistribution
|NormalDistribution
|韦伯分布
|codegen
|fitdist