您可以使用MATLAB®Coder™生成用于评估模糊推理系统的代码。有关生成代码的更多信息,请参见代码生成(MATLAB编码器).
要生成评估模糊系统的代码,必须首先创建模糊推理系统(FIS)。有关更多信息,请参见在命令行构建模糊系统和用模糊逻辑设计器构建模糊系统.
虽然本示例为1型Mamdani模糊推理系统生成代码,但该工作流也适用于Sugeno和2型模糊系统。
使用MATLAB编码器生成代码不支持模糊FIS对象(金宝appmamfis
,sugfis
,mamfistype2
,sugfistype2
).要生成用于评估模糊系统的代码,必须使用getFISCodeGenerationData
函数。
您可以将模糊推理系统的数据嵌入生成的代码中。如果不想在编译后更改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文件的执行:
评估MEX文件中的一个或多个输入值。当调用MEX文件时,指定与编译时相同的FIS结构。
使用以下方法评估原始FIS的相同输入值evalfis
.在评估使用evalfis
,使用相同的同构FIS结构。
比较评价结果。
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数据没有嵌入到生成的代码中。指定一个函数来评估在指定文件中定义的模糊系统文件名
对于给定的输入向量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
evalfis
|getFISCodeGenerationData