用MATLAB编码器生成模糊系统代码
您可以使用MATLAB®Coder™生成评估模糊系统的代码。有关生成代码的更多信息,请参见代码生成(MATLAB编码器).
创建模糊系统
为了生成用于评估模糊系统的代码,必须首先设计一个模糊推理系统。有关更多信息,请参见在命令行构建模糊系统,使用模糊逻辑设计器构建模糊系统,调整模糊推理系统.
您可以生成用于评估以下类型的模糊系统的代码。
Type-1 Mamdani FIS使用
mamfis
对象Type-1 Sugeno FIS实现使用
sugfis
对象Type-2 Mamdani FIS使用
mamfistype2
对象Type-2 Sugeno FIS实现使用
sugfistype2
对象FIS树实现使用
fistree
对象的任意组合mamfis
,sugfis
,mamfistype2
,或sugfistype2
对象
在本例中,您将为type-2 Sugeno FIS和FIS树生成代码。该工作流程也适用于其他类型的模糊系统。
加载最终调优的type-2 Sugeno FIS从利用Type-2 FIS预测混沌时间序列.
数据a1 =负载(“tunedfischaotictimeseriestype2.mat”);Fis = data1.fisout3;
加载最终调优的FIS树利用模糊逻辑设计人工胰腺控制器.
Data2 = load(“fuzzyPancreasExampleData.mat”);fisTree = data2.fisTMFTuned;
将模糊系统转化为齐次结构
使用MATLAB Coder生成代码不直接支持FIS对象或FIS树对象。金宝app方法将FIS或FIS树转换为同构结构,以生成用于评估模糊系统的代码getFISCodeGenerationData
函数。
将Sugeno FIS转换为均匀结构。
fisData = getFISCodeGenerationData(fis);
将FIS树转换为同构结构。
fisTreeData = getFISCodeGenerationData(fisree);
用嵌入式模糊系统生成代码
如果编译后不希望更改模糊系统属性,可以在生成的代码中嵌入FIS或FIS树数据。模糊系统的嵌入方法有三种。
从MATLAB工作区中嵌入FIS数据
嵌入MAT文件中的FIS数据
从FIS文件嵌入FIS数据(
* .fis
).
从MATLAB工作区嵌入FIS
为输入向量创建一个模糊系统的评估函数x
.属性的选项在此函数中evalfis
函数使用evalfisOptions
对象。
函数Y = evaluatefis1(fis,x)% # codegenopt = evalfisOptions“NumSamplePoints”, 51);Y = evalfis(fis,x,opt);结束
为evaluatefis1
使用Sugeno FIS储存在fisData
.当生成代码时:
指定
金融中间人
input参数为常量,它将FIS数据嵌入到生成的代码中。指定输入向量的大小。在本例中,FIS有四个输入变量。因此,将输入向量指定为包含四个元素的零向量。
为构建指定目标,例如静态库、可执行文件或MEX文件。对于本例,生成一个MEX文件。
codegen (“evaluatefis1”,“参数”,{code . constant (fisData),[0 0 0 0 0]},“配置:墨西哥人”)
代码生成成功。
验证MEX文件的执行。
计算MEX文件中的一个或多个输入值。在调用MEX文件时,指定与编译时使用的相同的FIS结构。
为相同的输入值计算原始FIS
evaluatefis1
.在评估FIS使用时evaluatefis1
,采用相同的均匀FIS结构。比较评价结果。
mexOutput1 = evaluatefis1_mex(fisData,[0.3 0.1 0.8 0.2])
mexOutput1 = 0.6913
evalfisOutput1 = evaluatefis1(fisData,[0.3 0.1 0.8 0.2])
evalfisOutput1 = 0.6913
从MAT文件中嵌入FIS
如果FIS或FIS树存储在MAT文件中,则可以通过从计算函数中加载FIS数据来将FIS数据嵌入到生成的代码中。
将FIS树数据保存到MAT文件中。
保存(“FISTreeData.mat”,“fisTreeData”,“垫”);
指定一个函数来计算输入向量x的FIS树。这个函数假设FIS树作为变量存储在MAT文件中fisTreeData
.
函数Y = evaluatefis2(x)% # codegenS = code .load(“FISTreeData.mat”);opt = evalfisOptions“NumSamplePoints”, 51);y = evalfis(s.fisTreeData,x,opt);结束
为evaluatefis2
.
codegen (“evaluatefis2”,“参数”,{[0 0 0]},“配置:墨西哥人”)
代码生成成功。
验证MEX文件的执行。
mexOutput2 = evaluatefis2_mex([105 0.25 0.001])
mexOutput2 = 0.7366
evalfisOutput2 = evaluatefis2([105 0.25 0.001])
evalfisOutput2 = 0.7366
从FIS文件中嵌入FIS
如果type-1或type-2 FIS存储在FIS文件中,则可以通过从计算函数中读取FIS数据来将FIS数据嵌入到生成的代码中。FIS树不支持此工作流。金宝app
将type-2 FIS保存到一个文件。
writeFIS (fis,“predictTimeSeries.fis”)
指定一个函数,用于对输入向量x的模糊系统进行评估。在这个函数中,从文件中读取FIS数据predictType2.fis
.由于存储的FIS是type-2系统,所以在调用时必须指定FIS类型getFISCodeGenerationData
.如果存储的FIS是type-1系统,则不必指定FIS类型。
函数Y = evaluatefis3(x)% # codegenfisData = getFISCodeGenerationData(“predictTimeSeries.fis”,“FuzzySetType”,“type2”);opt = evalfisOptions“NumSamplePoints”, 51);y = evalfis(fisData,x,opt);结束
为evaluatefis3
.
codegen (“evaluatefis3”,“参数”,{[0 0 0 0]},“配置:墨西哥人”)
代码生成成功。
验证MEX文件的执行。
mexOutput3 = evaluatefis3_mex([0.3 0.1 0.8 0.2])
mexOutput3 = 0.6913
evalfisOutput3 = evaluatefis3([0.3 0.1 0.8 0.2])
evalfisOutput3 = 0.6913
生成在运行时加载模糊系统的代码
若要在编译后更改FIS属性,可以生成用于计算在运行时从指定的FIS文件中读取的FIS的代码。在这种情况下,FIS数据没有嵌入到生成的代码中。FIS树不支持在编译FIS文件后修改模糊系统属性。金宝app
指定一个函数,用于对输入向量的指定FIS文件中定义的模糊系统进行评估x
.此函数使用相同的输入数据类型evaluatefis4
.
函数y = evaluatefis4(fisFileName,x)% # codegenfis = getFISCodeGenerationData(fisFileName,“FuzzySetType”,“type2”);opt = evalfisOptions“NumSamplePoints”, 51);Y = evalfis(fis,x,opt);结束
定义此函数的输入数据类型。
文件名= code .newtype(“字符”,[1 Inf],[false true]);X = code .newtype(“双”,[1 Inf],[false true]);
为evaluatefis4
.
codegen (“evaluatefis4”,“参数”{文件名,x},“配置:墨西哥人”)
代码生成成功。
验证MEX文件的执行。
mexOutput4 = evaluatefis4_mex(“predictTimeSeries.fis”,[0.3 0.1 0.8 0.2])
mexOutput4 = 0.6913
evalfisOutput4 = evalatefis4 (“predictTimeSeries.fis”,[0.3 0.1 0.8 0.2])
evalfisOutput4 = 0.6913
每次你奔跑evaluatefis4
,该函数从指定文件中重新加载模糊系统。为了提高计算效率,可以创建一个不重新加载先前加载的FIS的函数。例如,evaluatefis5
函数只在指定了新文件名时才从FIS文件中加载FIS。
函数y = evaluatefis5(fileName,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 = getFISCodeGenerationData(fisName,“FuzzySetType”,“type2”);结束
为evaluatefis5
.此函数的输入数据类型与for相同evaluatefis2
.
codegen (“evaluatefis5”,“参数”{文件名,x},“配置:墨西哥人”)
代码生成成功。
使用存储的type-2 FIS执行MEX文件。
mexOutput5 = evaluatefis5_mex(“predictTimeSeries.fis”,[0.3 0.1 0.8 0.2])
mexOutput5 = 0.6913
您可以使用此函数计算具有相同输入数量的另一个FIS。例如,保存FIS的中间版本利用Type-2 FIS预测混沌时间序列来predictTimeSeries2.fis
,并使用MEX文件对相同的输入值计算FIS。
writeFIS (data1.fisout2“predictTimeSeries2.fis”) mexOutput5_2 = evaluatefis5_mex(“predictTimeSeries2.fis”,[0.3 0.1 0.8 0.2])
mexOutput5_2 = 0.7934
生成单精度数据代码
前面的示例为双精度数据生成代码。若要为单精度数据生成代码,请将输入值的数据类型指定为单
.在计算FIS对象和FIS树对象时,可以使用单精度数据。例如,为生成代码evaluatefis2
使用单精度数据。
codegen (“evaluatefis2”,“参数”,{single([0 0 0])},“配置:墨西哥人”)
代码生成成功。
执行MEX文件,传入单精度输入值。
mexOutputSingle = evaluatefis2_mex(single([105 0.25 0.001]))
mexOutputSingle = 0.7366
另请参阅
evalfis
|evalfisOptions
|getFISCodeGenerationData