主要内容

概率分布对象的代码生成

此示例显示了如何生成适合概率分布的代码,以进行样本数据,并评估拟合分布。

首先,定义使用的入口点函数Fitdist.要创建概率分布对象并使用其对象功能来评估拟合分布。然后,通过使用生成输入点功能的代码Codegen.(MATLAB编码器).入口点函数可以具有概率分布对象作为输入参数和输出参数。因此,或者,您可以定义两个入口点功能,用于拟合分布,另一个用于评估拟合分布。第一个入口点函数返回拟合分布,第二个入口点函数接受拟合分发作为输入参数。此示例首先描述具有单个入口点函数的工作流程,然后简要介绍具有两个入口点函数的工作流程。

Fitdist.金宝app支持Beta,指数,极值,逻辑,正常和Weibull分布的代码生成。由...金宝app创建的拟合概率分布对象的支持对象功能Fitdist., 是CDF.ICDF.IQR.的意思是中位数PDF.STD.截短, 和var.

有关代码生成的更多信息,请参阅一般代码生成工作流程

定义入口点函数

定义命名的入口点函数myfitandevaluate.采用分发的示例数据,分发名称,截断限制,以及评估累积分布函数(CDF)和概率密度函数(PDF)的数据值。在入口点函数中,将概率分布对象拟合到示例数据,截断向指定截断限制的分布,计算截断分布的平均值,并在指定的数据值下计算CDF和PDF值。

显示该内容myFitandEvaluate.m文件。

类型myFitandEvaluate.m
函数[pd_trungated,st] = myfitandevaluate(data,distname,truncation_limits,x)%#codegen%拟合概率分布对象到数据。pd = fitdist(数据,distname);%截断PD。pd_trungated = truncate(pd,truncation_limits(1),truncation_limits(2));%计算截短的PD的平均值。mean_val =均值(pd_trungated);%计算CDF和PDF,在x下进行评估。cdf_val = cdf(pd_trungated,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} = 1 (100 1);ARGS{2} =编码器。常数('指数');args {3} = =那些(1,2);args {4} = =那些(10,1);

第二个输入myfitandevaluate.是一个分布名称,它是第二个输入参数Fitdist..这个参数必须是一个编译时常量。因此,您指定args {2}通过使用编码器.Constant.(MATLAB编码器)

如果要指定args {1}args {3}作为可变大小的输入,使用Coder.typeof.(MATLAB编码器).有关详细信息,请参阅一般代码生成工作流程

从入口点函数生成MEX功能myfitandevaluate..使用使用的输入参数类型- args.选项和单元格数组args.

Codegen.myfitandevaluate.-  args.args.
代码成功。

Codegen.(MATLAB编码器)生成MEX函数myfitandevaluate_mex.使用当前文件夹中的平台依赖扩展名。

验证生成的代码

通过一些数据来验证是否myfitandevaluate.myfitandevaluate_mex.返回相同的输出。

rng (“默认”重复性的%data = exprnd(1,[100,1]);指数随机数与平均参数1distname ='指数';truncation_limits = [0,4];x =(0:9)';[pd_trungated,st] = myfitandevaluate(数据,distname,truncation_limits,x);[pd_truncated_mex,st_mex] = myfitandevaluate_mex(数据,distname,truncation_limits,x);

比较概率分布对象pd_trungated.pd_truncated_mex.

pd_trungated.
pd_truncated = exponentialLifribution指数分布mu = 0.917049截断到间隔[0,4]
pd_truncated_mex.
pd_truncated_mex = exponentialDistibution指数分布MU = 0.917049截断到间隔[0,4]
verifyMEX_pd = isequal (pd_truncated pd_truncated_mex)
验证evex_pd =逻辑1

是平等的返回逻辑1 (真的),这意味着pd_trungated.pd_truncated_mex.是平等的。

比较包含平均值、cdf和pdf值的结构数组。

verifymex_st = isequal(st,st_mex)
验证evex_st =逻辑1

比较证实了myfitandevaluate.myfitandevaluate_mex.返回相同的输出。如上所述,所生成的代码可能不会产生与MATLAB相同的浮点数数字结果生成代码与MATLAB代码之间的差异(MATLAB编码器).在这种情况下,比较允许小公差的值。

工作流有两个入口点函数

入口点函数可以具有概率分布对象作为输入参数和输出参数。因此,您可以定义两个入口点函数,一个用于拟合分发,另一个用于评估拟合分布。然后为两个入口点函数生成代码。

定义入口点函数

定义两个入口点函数。第一个入口点函数myfitdist.适合对样本数据的概率分布对象。第二个入口点函数myevalutatist.截断分布,计算截断分布的平均值,并在指定的数据值下计算CDF和PDF值。myevalutatist.的输出myfitdist.作为输入参数。

显示该内容myFitDist.mmyevalativeist.m.文件。

类型myFitDist.m
函数pd = myfitdist(data,dist)%#codegen%fit概率分布对象到数据。pd = fitdist(数据,dist);结尾
类型myevalativeist.m.
函数[pd_trungated,st] = myevaLientist(pd,truncation_limits,x)%#codegen%truncate pd。pd_trungated = truncate(pd,truncation_limits(1),truncation_limits(2));%计算截短的PD的平均值。mean_val =均值(pd_trungated);%计算CDF和PDF,在x下进行评估。cdf_val = cdf(pd_trungated,x);pdf_val = pdf(pd_truncated,x);%创建包含平均值,CDF和PDF值的结构阵列。st = struct('alc',man,cdf',cdf_val,'pdf',pdf_val);结尾

生成代码

的输入参数类型myfitdist.myevalutatist.

ARGS_myFitDist =细胞(2,1);ARGS_myFitDist {1} = 1 (100 1);ARGS_myFitDist{2} =编码器。常数('指数');args_myevaliverist = cell(3,1);args_myevaliveist {1} = fitdist(exprnd(1,[100,1]),'指数');args_myevaluentist {2} =那些(1,2);args_myevaliveist {3} = {3}(10,1);

如果您不需要生成MEX函数,则可以指定args_myevaliveist {1}作为Coder.Outputtype('myfitdist'),如上所述通过作为输入的入口点函数输出(MATLAB编码器).你不能使用Coder.Outputtype.(MATLAB编码器)生成MEX函数时,因为输出的数据类型myfitdist.与输入的数据类型不匹配myevalutatist.在生成的mex函数中。

为两个入口点函数生成代码。

Codegen.- omyFitandEvaluate_mex2myfitdist.-  args.args_myfitdist.myevalutatist.-  args.args_myevaluentist.
代码成功。

Codegen.(MATLAB编码器)生成MEX函数myFitandEvaluate_mex2.有关为多个入口点函数生成代码的详细信息,请参阅生成多个入口点函数的代码(MATLAB编码器)

验证生成的代码

验证生成的代码。

rng (“默认”)Data = Exprnd(1,[100,1]);distname ='指数';truncation_limits = [0,4];x =(0:9)';pd2 = myfitdist(数据,distname);[pd_truncated2,st2] = myevaliverist(pd2,truncation_limits,x);pd_mex2 = myfitandevaluate_mex2('myfitdist',数据,distname);[pd_truncated_mex2,st_mex2] = myfitandevaluate_mex2('myevaliverist',pd_mex2,truncation_limits,x);验证ex_pd2 = isequal(pd2,pd_mex2)
验证evex_pd2 =逻辑1
验证evex_pd_trungated2 = isequal(pd_truncated2,pd_truncated_mex)
验证evex_pd_trungated2 =逻辑1
验证ex_st2 = isequal(st2,st_mex2)
verifyMEX_st2 =逻辑1

是平等的返回逻辑1 (真的),这意味着输入点函数和相应的MEX函数返回相同的输出。

也可以看看

|||||||(MATLAB编码器)

相关的话题