主要内容

概率分布对象的代码生成

这个例子展示了如何生成代码,使样本数据符合概率分布,并对符合的分布进行评估。

首先,定义一个入口点函数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使用当前文件夹中与平台相关的扩展名。

验证生成的代码

传递一些数据来验证是否myFitandEvaluatemyFitandEvaluate_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_truncatedpd_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_truncatedpd_truncated_mex是相等的。

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

st_mex verifyMEX_st = isequal(圣)
verifyMEX_st =逻辑1

对比证实了myFitandEvaluatemyFitandEvaluate_mex返回相同的输出。生成的代码可能不会产生与MATLAB相同的浮点数值结果,如生成代码与MATLAB代码的区别(MATLAB编码器).在这种情况下,比较允许小公差的值。

具有两个入口点功能的工作流

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

定义入口点函数

定义两个入口点函数。第一个入口点函数myFitDist将概率分布对象拟合到样本数据中。第二个入口点函数myEvaluateDist截断分布,计算截断分布的平均值,并在指定的数据值处计算CDF和PDF值。myEvaluateDist的输出myFitDist作为输入参数。

显示的内容myFitDist.mmyEvaluateDist.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);结束

生成代码

的输入参数类型myFitDistmyEvaluateDist

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函数返回相同的输出。

另请参阅

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

相关的话题