主要内容

用MATLAB编码器生成模糊系统代码

您可以使用MATLAB®Coder™生成用于评估模糊推理系统的代码。有关生成代码的更多信息,请参见代码生成(MATLAB编码器)

要生成评估模糊系统的代码,必须首先创建模糊推理系统(FIS)。有关更多信息,请参见在命令行构建模糊系统用模糊逻辑设计器构建模糊系统

虽然本示例为1型Mamdani模糊推理系统生成代码,但该工作流也适用于Sugeno和2型模糊系统。

使用MATLAB编码器生成代码不支持模糊FIS对象(金宝appmamfissugfismamfistype2sugfistype2).要生成用于评估模糊系统的代码,必须使用getFISCodeGenerationData函数。

在生成的代码中嵌入FIS数据

您可以将模糊推理系统的数据嵌入生成的代码中。如果不想在编译后更改FIS数据,请使用此选项。

首先,创建一个模糊系统,或者从.fis文件。对于这个例子,从tipper.fis

fisObject = readfis (“tipper.fis”);

要使用此FIS进行代码生成,请将其转换为同构结构。

fis = getFISCodeGenerationData (fisObject);

默认情况下,getFISCodeGenerationData假设FIS对象是一个type-1系统。要为类型2系统生成代码,必须使用getFISCodeGenerationData (fisObject“type2”)

创建一个评价模糊系统的函数金融中间人对于给定的输入向量x.在这个函数中,可以为evalfis函数使用evalfisOptions

函数x y = evaluatefis1 (fis)% # codegen选择= evalfisOptions (“NumSamplePoints”, 51);y = evalfis (fis, x,选择);结束

生成的代码evaluatefis1,指定金融中间人输入参数是常量。您可以为构建指定不同的目标,例如静态库、可执行文件或MEX文件。对于本例,生成一个MEX文件。

codegen (“evaluatefis1”“参数”, {coder.Constant (fis), [0 0]},“配置:墨西哥人”
代码生成成功。

验证MEX文件的执行:

  1. 评估MEX文件中的一个或多个输入值。当调用MEX文件时,指定与编译时相同的FIS结构。

  2. 使用以下方法评估原始FIS的相同输入值evalfis.在评估使用evalfis,使用相同的同构FIS结构。

  3. 比较评价结果。

mexOutput1 = evaluatefis1_mex(fis,[7 9])
mexOutput1 = 21.0327
选择= evalfisOptions (“NumSamplePoints”, 51);evalfisOutput = evalfis(fis,[7 9],opt)
evalfisOutput = 21.0327

MEX文件输出匹配evalfis输出。

或者,您可以通过在代码生成时从文件中读取FIS数据,将FIS数据嵌入生成的代码中。指定一个函数,用于评估给定输入向量x的模糊系统。在这个函数中,从文件中读取FIS数据tipper.fis

函数y = evaluatefis2 (x)% # codegenfis = getFISCodeGenerationData (“tipper.fis”);选择= evalfisOptions (“NumSamplePoints”, 51);y = evalfis (fis, x,选择);结束

生成的代码evaluatefis2

codegen (“evaluatefis2”“参数”{[0 0]},“配置:墨西哥人”
代码生成成功。

使用相同的输入值验证MEX文件的执行x.在这种情况下,您不必指定编译时使用的原始FIS结构。

mexOutput2 = evaluatefis2_mex([7 9])
mexOutput2 = 21.0327
evalfisOutput
evalfisOutput = 21.0327

在运行时生成加载FIS数据的代码

您可以生成代码来评估从.fis在运行时指定的文件。在这种情况下,FIS数据没有嵌入到生成的代码中。指定一个函数来评估在指定文件中定义的模糊系统文件名对于给定的输入向量x

函数x y = evaluatefis3(文件名)% # codegenfis = getFISCodeGenerationData(文件名);选择= evalfisOptions (“NumSamplePoints”, 51);y = evalfis (fis, x,选择);结束

定义此函数的输入数据类型。

文件名= coder.newtype (“字符”[1正],[假真]);x = coder.newtype (“双”[1正],[假真]);

生成的代码evaluatefis3

codegen (“evaluatefis3”“参数”{文件名,x},“配置:墨西哥人”
代码生成成功。

使用相同的输入值验证MEX文件的执行x.在本例中,指定.fis文件。

mexOutput3 = evaluatefis3_mex (“tipper.fis”, 9 [7])
mexOutput3 = 21.0327
evalfisOutput
evalfisOutput = 21.0327

每次你奔跑evaluatefis3,它从文件中重新加载模糊系统。为了计算效率,您可以创建一个只在指定新文件名时加载FIS的函数。

函数x y = evaluatefis4(文件名)% # codegen% #内部持续的fisName fis如果isempty(fisName) [fisName,fis] = loadFIS(fileName); / /指定文件名elseif~strcmp(fisName,fileName) [fisName,fis] = loadFIS(fileName);结束选择= evalfisOptions (“NumSamplePoints”, 51);y = evalfis (fis, x,选择);结束函数[fisName,fis] = loadFIS(fileName) fisName = fileName;fis = getFISCodeGenerationData (fisName);结束

生成代码evaluatefis4.此函数的输入数据类型与for相同evaluatefis3

codegen (“evaluatefis4”“参数”{文件名,x},“配置:墨西哥人”
代码生成成功。

使用相同的输入值文件名验证MEX文件的执行。

mexOutput4 = evaluatefis4_mex (“tipper.fis”, 9 [7])
mexOutput4 = 21.0327
evalfisOutput
evalfisOutput = 21.0327

为单精度数据生成代码

前面的示例为双精度数据生成了代码。要为单精度数据生成代码,请将输入值的数据类型指定为.例如,为evaluatefis2使用单精确数据。

codegen (“evaluatefis2”“参数”,{单([0 0])},“配置:墨西哥人”
代码生成成功。

验证MEX文件的执行,传入单精度输入值。

mexOutputSingle = evaluatefis2_mex(single([7 9])))
mexOutputSingle =21.0327
evalfisOutput
evalfisOutput = 21.0327

另请参阅

|

相关的话题