概率分布对象的代码生成
这个例子展示了如何生成代码符合样本数据的概率分布和评价拟合分布。
首先,定义一个入口点函数,使用fitdist
创建一个概率分布对象,并使用它的对象函数来评价拟合分布。然后,生成代码的入口点函数的使用codegen
(MATLAB编码器)。一个入口点函数可以有一个概率分布对象作为一个输入参数和一个输出参数。因此,另外,你可以定义两个入口点函数,一个用于拟合分布,另一个用于评价拟合分布。第一个入口点函数返回一个拟合分布,第二个入口点函数接受安装分布作为输入参数。这个例子首先描述了工作流与一个单一的入口点函数,然后简要描述了工作流与两个入口点函数。
fitdist
金宝app支持代码生成β、指数、极端值,对数正态,正常的,和威布尔分布。支持的对金宝app象函数拟合概率分布的对象,由fitdist
,都是提供
,icdf
,位差
,的意思是
,中位数
,pdf
,性病
,截断
,var
。
代码生成的更多信息,请参阅通用代码生成工作流。
定义入口点函数
定义一个入口点函数命名myFitandEvaluate
,将样本数据分布的名字,截断分布的限制,和数据值的评价累积分布函数(cdf)和概率密度函数(pdf)。内的入口点函数,适合一个概率分布对象示例数据,截断到指定的截断分布限制,计算截尾分布的均值,计算提供和pdf值在指定的数据值。
显示的内容myFitandEvaluate.m
文件。
类型myFitandEvaluate.m
函数[pd_truncated、圣]= myFitandEvaluate(数据、distname truncation_limits, x) % # codegen %概率分布对象的数据。pd = fitdist(数据、distname);%截断pd。pd_truncated =截断(pd, truncation_limits (1) truncation_limits (2));%计算截pd的均值。mean_val =意味着(pd_truncated);在x %计算cdf和pdf评估cdf_val = cdf (pd_truncated x);pdf_val = pdf (pd_truncated x);%包含的意思是,创建一个结构数组提供,pdf格式的值。mean_val圣=结构(“的意思是”,“提供”,cdf_val, pdf, pdf_val); end
注意:如果单击按钮位于这个页面的右上角部分并在MATLAB®开设这个例子,然后用MATLAB打开示例文件夹。这个文件夹包含的入口点函数文件对于这个示例。
生成代码
指定的输入参数类型myFitandEvaluate
使用4-by-1单元阵列。将每个入口点函数的输入参数类型分配给每一个细胞。指定数据类型和准确的输入数组大小通过使用一组示例值代表的值和一个特定的数据类型和数组的大小。
ARGS =细胞(4,1);ARGS {1} = 1 (100 1);ARGS {2} = coder.Constant (“指数”);的参数{3}= (1、2);ARGS {4} = 1 (10, 1);
第二个输入的myFitandEvaluate
是一个分布的名字,第二个输入参数的fitdist
。这个参数必须是一个编译时常量。因此,您指定ARGS {2}
通过使用coder.Constant
(MATLAB编码器)。
如果你想指定ARGS {1}
和ARGS {3}
为适应输入,使用coder.typeof
(MATLAB编码器)。有关详细信息,请参见通用代码生成工作流。
生成一个墨西哥人从入口点函数的函数myFitandEvaluate
。指定输入参数类型使用arg游戏
选项和单元阵列arg游戏
。
codegenmyFitandEvaluatearg游戏arg游戏
代码生成成功。
codegen
(MATLAB编码器)生成墨西哥人的功能myFitandEvaluate_mex
与平台相关的扩展在当前文件夹。
验证生成的代码
通过一些数据来验证是否myFitandEvaluate
和myFitandEvaluate_mex
返回相同的输出。
rng (“默认”)%的再现性data = exprnd(1,[1] 100年);% 1意味着参数指数分布随机数字distname =“指数”;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
pd_truncated_mex = ExponentialDistribution指数分布μ= 0.917049截短的区间[0,4]
verifyMEX_pd = isequal (pd_truncated pd_truncated_mex)
verifyMEX_pd =逻辑1
isequal
返回逻辑1 (真正的
),这意味着pd_truncated
和pd_truncated_mex
是相等的。
比较结构数组,包含的意思是,它强调,pdf格式的值。
st_mex verifyMEX_st = isequal(圣)
verifyMEX_st =逻辑1
比较证实,myFitandEvaluate
和myFitandEvaluate_mex
返回相同的输出。生成的代码可能不像MATLAB产生相同的浮点数值结果,所述生成的代码和MATLAB代码之间的区别(MATLAB编码器)。在这种情况下,允许一个小公差比较值。
工作流与两个入口点函数
一个入口点函数可以有一个概率分布对象作为一个输入参数和一个输出参数。因此,您可以定义两个入口点函数,一个用于拟合分布,另一个用于评价拟合分布。然后生成两个入口点函数的代码。
定义入口点函数
定义两个入口点函数。第一个入口点函数myFitDist
适合一个概率分布对象的示例数据。第二个入口点函数myEvaluateDist
截断分布,计算截尾分布的均值,计算提供和pdf值在指定的数据值。myEvaluateDist
需要的输出myFitDist
作为输入参数。
显示的内容myFitDist.m
和myEvaluateDist.m
文件。
类型myFitDist.m
函数pd = myFitDist(数据,dist) % # codegen %概率分布的数据对象。pd = fitdist(数据、区域);结束
类型myEvaluateDist.m
函数[pd_truncated、圣]= myEvaluateDist (pd truncation_limits x) % # codegen %截断pd。pd_truncated =截断(pd, truncation_limits (1) truncation_limits (2));%计算截pd的均值。mean_val =意味着(pd_truncated);在x %计算cdf和pdf评估cdf_val = cdf (pd_truncated x);pdf_val = pdf (pd_truncated x);%包含的意思是,创建一个结构数组提供,pdf格式的值。mean_val圣=结构(“的意思是”,“提供”,cdf_val, pdf, pdf_val);结束
生成代码
指定的输入参数类型myFitDist
和myEvaluateDist
。
ARGS_myFitDist =细胞(2,1);ARGS_myFitDist {1} = 1 (100 1);ARGS_myFitDist {2} = coder.Constant (“指数”);ARGS_myEvaluateDist =细胞(3,1);ARGS_myEvaluateDist {1} = fitdist (exprnd(1,[1] 100年),“指数”);ARGS_myEvaluateDist {2} = 1 (1、2);ARGS_myEvaluateDist {3} = 1 (10, 1);
如果你不需要生成一个墨西哥人功能,那么您可以指定ARGS_myEvaluateDist {1}
作为coder.OutputType (“myFitdist”)
描述的一样,通过一个入口点函数的输出作为输入(MATLAB编码器)。你不能使用coder.OutputType
(MATLAB编码器)当生成一个墨西哥人功能,因为输出的数据类型myFitDist
输入的数据类型不匹配myEvaluateDist
在生成的墨西哥人的功能。
两个入口点函数生成代码。
codegen- omyFitandEvaluate_mex2myFitDistarg游戏ARGS_myFitDistmyEvaluateDistarg游戏ARGS_myEvaluateDist
代码生成成功。
codegen
(MATLAB编码器)生成墨西哥人的功能myFitandEvaluate_mex2
。对多个入口点函数生成代码的详细信息,明白了为多个入口点函数生成代码(MATLAB编码器)。
验证生成的代码
验证所生成的代码。
rng (“默认”)数据= exprnd(1,[1] 100年);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 (真正的
),这意味着入口点函数和相应的墨西哥人函数返回相同的输出。
另请参阅
codegen
(MATLAB编码器)|fitdist
|BetaDistribution
|ExponentialDistribution
|ExtremeValueDistribution
|LognormalDistribution
|NormalDistribution
|WeibullDistribution