使用MATLAB编码器为模糊系统生成代码
您可以使用MATLAB®CODER™生成用于评估模糊推理系统的代码。有关生成代码的更多信息,请参阅代码生成(MATLAB编码器)。
要生成用于评估模糊系统的代码,您必须首先创建模糊推理系统(FIS)。有关更多信息,请参阅在命令行中构建模糊系统和使用模糊逻辑设计师构建模糊系统。
尽管此示例为1型Mamdani模糊推理系统生成代码,但该工作流也适用于Sugeno和Type-2模糊系统。
使用MATLAB编码器生成代码不支持模糊FIS对象(金宝appMamfis
,,,,sugfis
,,,,mamfistype2
,,,,sugfistype2
)。要生成用于评估模糊系统的代码,您必须使用模糊推理系统对象将模糊推理系统对象转换为均匀的结构getFistodegenerationData
功能。
将FIS数据嵌入生成代码中
您可以在生成的代码中嵌入模糊推理系统的数据。如果您不想在编译后更改FIS数据,请使用此选项。
首先,创建模糊系统,或从一个模糊系统中加载模糊系统.fis
文件。对于此示例,从Tipper.fis
。
fisobject = readfis(“ Tipper.fis”);
要将此FI用于代码生成,请将其转换为均匀的结构。
fis = getFisteNerationData(fisObject);
默认情况下,getFistodegenerationData
假设FIS对象是类型1系统。要为2型系统生成代码,必须使用getfisodegenerationdata(fisobject,“ type2”)
。
创建一个用于评估模糊系统的函数FIS
对于给定的输入向量X
。在此功能中,您可以为评估
函数使用评估
。
功能y = estaruefis1(fis,x)%#codegenopt = evalfisoptions('numSamplepoints',51);y = evalfis(fis,x,opt);结尾
生成代码评估FIS1
,指定FIS
输入参数是恒定的。您可以为构建指定不同的目标,例如静态库,可执行文件或MEX文件。对于此示例,生成一个MEX文件。
Codegen(Codegen)('evaluefis1',,,,'-args',{coder.constant(fis),[0 0]},'-config:mex')
代码生成成功。
验证MEX文件的执行:
评估一个或多个输入值的MEX文件。调用MEX文件时,指定与编译时使用的相同的FIS结构。
使用相同的输入值评估原始FI
评估
。评估使用时评估
,使用相同的均匀FIS结构。比较评估结果。
mexoutput1 = estaiutefis1_mex(FIS,[7 9])
mexoutput1 = 21.0327
opt = evalfisoptions('numSamplepoints',51);evalfisoutput = evalfis(FIS,[7 9],OPT)
evalfisoutput = 21.0327
MEX文件输出与评估
输出。
另外,您可以通过在代码生成时间中读取文件中的FIS数据将FIS数据嵌入生成的代码中。指定一个用于评估给定输入向量X的模糊系统的函数。在此功能中,从文件中读取FIS数据Tipper.fis
。
功能y = esturefis2(x)%#codegenfis = getFiscodeGenerationData('Tipper.fis');opt = evalfisoptions('numSamplepoints',51);y = evalfis(fis,x,opt);结尾
生成代码评估FIS2
。
Codegen(Codegen)(“ esturefis2',,,,'-args',{[0 0]},'-config:mex')
代码生成成功。
使用相同的输入值验证MEX文件的执行X
。在这种情况下,您不必指定编译时使用的原始FIS结构。
mexoutput2 = estaiutefis2_mex([7 9])
mexoutput2 = 21.0327
evalfisoutput
evalfisoutput = 21.0327
生成用于在运行时加载FIS数据的代码
您可以生成用于评估FIS的代码.fis
在运行时指定的文件。在这种情况下,FIS数据未嵌入生成的代码中。指定用于评估指定文件中定义的模糊系统的函数文件名
对于给定的输入向量X
。
功能y = estaruefis3(文件名,x)%#codegenfis = getFiscodeGenerationData(filename);opt = evalfisoptions('numSamplepoints',51);y = evalfis(fis,x,opt);结尾
为此功能定义输入数据类型。
filename = coder.newtype('char',[1 inf],[false true]);x = coder.newtype('双倍的',[1 inf],[false true]);
生成代码评估FIS3
。
Codegen(Codegen)(“评估FIS3”,,,,'-args',{filename,x},'-config:mex')
代码生成成功。
使用相同的输入值验证MEX文件的执行X
。在这种情况下,您指定了.fis
文件。
mexoutput3 = estaruefis3_mex('Tipper.fis',[7 9])
mexoutput3 = 21.0327
evalfisoutput
evalfisoutput = 21.0327
每次跑步评估FIS3
,它从文件中重新加载模糊系统。对于计算效率,您可以创建一个仅在指定新文件名时加载FIS的函数。
功能y = estaruefis4(文件名,x)%#codegen执着的fisname fis如果Isempty(fisname)[fisname,fis] = loadfis(filename);Elseif〜STRCMP(fisname,filename)[fisname,fis] = loadFis(filename);结尾opt = evalfisoptions('numSamplepoints',51);y = evalfis(fis,x,opt);结尾功能[fisname,fis] = loadfis(filename)fisname = filename;fis = getFisteNerationData(fisname);结尾
生成代码评估FIS4
。此功能的输入数据类型与评估FIS3
。
Codegen(Codegen)(“评估FIS4”,,,,'-args',{filename,x},'-config:mex')
代码生成成功。
使用相同的输入值文件名来验证MEX文件的执行。
mexoutput4 = estaruefis4_mex('Tipper.fis',[7 9])
mexoutput4 = 21.0327
evalfisoutput
evalfisoutput = 21.0327
生成单位数据的代码
前面的示例生成了双精度数据的代码。要生成单位数据的代码,请指定输入值的数据类型为单身的
。例如,生成代码评估FIS2
使用单精度数据。
Codegen(Codegen)(“ esturefis2',,,,'-args',{单([0 0])},'-config:mex')
代码生成成功。
验证MEX文件执行,以单精度输入值传递。
mexOutputsingle = evaluefuatefis2_mex(单个([7 9]))
mexoutputsingle =单身的21.0327
evalfisoutput
evalfisoutput = 21.0327