主要内容

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

您可以生成代码来评估一个模糊系统使用MATLAB®编码器™。生成代码的更多信息,请参阅代码生成(MATLAB编码器)

建立模糊系统

来生成代码模糊评价系统,您必须首先设计一个模糊推理系统(FIS)。有关更多信息,请参见在命令行构建模糊系统,使用模糊逻辑构建模糊系统设计师,调优模糊推理系统

您可以生成代码来评估以下类型的模糊系统。

  • 1型Mamdani FIS使用一个实现mamfis对象

  • 1型Sugeno FIS使用一个实现sugfis对象

  • 2型Mamdani FIS使用一个实现mamfistype2对象

  • 2型Sugeno FIS使用一个实现sugfistype2对象

  • FIS树实现使用fistree对象包含的任意组合mamfis,sugfis,mamfistype2,或sugfistype2对象

在本例中,您生成代码2型Sugeno FIS和FIS树。工作流也适用于其他类型的模糊系统。

加载最后调2型Sugeno金融中间人使用2型FIS预测混沌时间序列

data1 =负载(“tunedfischaotictimeseriestype2.mat”);fis = data1.fisout3;

加载最后调FIS树使用模糊逻辑控制器设计人工胰腺

data2 =负载(“fuzzyPancreasExampleData.mat”);fisTree = data2.fisTMFTuned;

将模糊系统转换成均匀的结构

生成代码使用MATLAB编码器不支持直接FIS对象或FIS树对象。万博1manbetx相反,为评估一个模糊系统生成代码,你必须将你的金融中间人或FIS树成均匀结构使用getFISCodeGenerationData函数。

Sugeno FIS转换为一个均匀的结构。

fisData = getFISCodeGenerationData (fis);

FIS树转换成一个均匀的结构。

fisTreeData = getFISCodeGenerationData (fisTree);

生成代码嵌入模糊系统

如果你不想改变编译后的模糊系统属性,你可以嵌入FIS或者FIS树的数据在生成的代码。有三个方法嵌入模糊系统。

  • 从MATLAB嵌入FIS数据工作区

  • 嵌入FIS垫的数据文件

  • 嵌入FIS FIS的数据文件(* .fis)。

从MATLAB嵌入FIS工作区

创建一个函数来评估一个模糊系统的输入向量x。在这个函数中,您可以指定选项evalfis函数使用一个evalfisOptions对象。

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

生成的代码evaluatefis1使用2型Sugeno FIS存储在fisData。当生成代码:

  • 指定该金融中间人输入参数是常数,内嵌入FIS数据生成的代码。

  • 指定输入向量的大小。在这种情况下,金融中间人有四个输入变量。因此,指定输入向量的向量0有四个元素。

  • 指定您的构建的目标,比如一个静态库,一个可执行文件,或一个墨西哥人文件。对于这个示例,生成一个墨西哥人文件。

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

验证墨西哥人的执行文件:

  1. 对墨西哥人申请一个或多个输入值。当你叫墨西哥人文件,指定相同的FIS结构,在编译时使用。

  2. 评估的原始FIS使用相同的输入值evaluatefis1。当评估FIS使用evaluatefis1,使用相同的均匀FIS结构。

  3. 评价结果进行比较。

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

从垫文件嵌入金融中间人

如果你的金融中间人或FIS树存储在一个垫子文件,您可以在生成的代码中嵌入FIS数据通过加载FIS数据从内部评估函数。

将FIS树的数据保存到一个垫子文件。

保存(“FISTreeData.mat”,“fisTreeData”,“垫”);

指定一个函数为评价FIS树输入向量x。这个函数假设FIS树存储在垫文件作为变量fisTreeData

函数y = evaluatefis2 (x)% # codegens = coder.load (“FISTreeData.mat”);选择= evalfisOptions (“NumSamplePoints”,51);x, y = evalfis (s.fisTreeData选择);结束

生成的代码evaluatefis2

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

墨西哥人的执行文件进行验证。

mexOutput2 = evaluatefis2_mex (0.25 - 0.001 [105])
mexOutput2 = 0.7366
evalfisOutput2 = evaluatefis2 (0.25 - 0.001 [105])
evalfisOutput2 = 0.7366

从FIS文件嵌入金融中间人

如果你的1型或2型金融中间人是存储在FIS文件,您可以在生成的代码中嵌入FIS数据通过阅读FIS数据从内部评估函数。此工作流不支持FIS树。万博1manbetx

将2型FIS保存到一个文件中。

writeFIS (fis,“predictTimeSeries.fis”)

指定一个函数来评估一个模糊系统的输入向量x。在这个函数中,阅读FIS的数据文件predictType2.fis。由于存储金融中间人是一个2型系统,您必须指定FIS当调用类型getFISCodeGenerationData。如果您的存储FIS是1型系统,您不需要指定FIS类型。

函数y = evaluatefis3 (x)% # codegenfisData = getFISCodeGenerationData (“predictTimeSeries.fis”,“FuzzySetType”,“type2”);选择= evalfisOptions (“NumSamplePoints”,51);x, y = evalfis (fisData选择);结束

生成的代码evaluatefis3

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

墨西哥人的执行文件进行验证。

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树。万博1manbetx

指定一个函数中定义的模糊系统评价FIS文件指定为输入向量x。这个函数使用相同的输入数据类型evaluatefis4

函数y = evaluatefis4 (fisFileName, x)% # codegenfis = getFISCodeGenerationData (fisFileName,“FuzzySetType”,“type2”);选择= evalfisOptions (“NumSamplePoints”,51);y = evalfis (fis, x,选择);结束

为这个函数定义输入数据类型。

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

生成的代码evaluatefis4

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

墨西哥人的执行文件进行验证。

mexOutput4 = evaluatefis4_mex (“predictTimeSeries.fis”(0.3 - 0.1 0.8 - 0.2))
mexOutput4 = 0.6913
evalfisOutput4 = evaluatefis4 (“predictTimeSeries.fis”(0.3 - 0.1 0.8 - 0.2))
evalfisOutput4 = 0.6913

每次运行evaluatefis4,函数重载的模糊系统指定的文件中。计算效率,您可以创建一个函数,不重新加载之前加载金融中间人。例如,evaluatefis5函数加载FIS FIS文件只有当一个新的指定文件名。

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

生成的代码evaluatefis5。这个函数的输入数据类型是一样的evaluatefis2

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

使用存储2型FIS的墨西哥人文件执行。

mexOutput5 = evaluatefis5_mex (“predictTimeSeries.fis”(0.3 - 0.1 0.8 - 0.2))
mexOutput5 = 0.6913

您可以使用这个函数来评估另一个FIS相同数量的输入。例如,节省中间FIS的版本使用2型FIS预测混沌时间序列predictTimeSeries2.fis,评估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”,“参数”,{单身([0 0 0])},“配置:墨西哥人”)
代码生成成功。

墨西哥人文件执行,传入单精确输入值。

mexOutputSingle = evaluatefis2_mex(单(0.25 - 0.001 [105]))
mexOutputSingle = 0.7366

另请参阅

||

相关的话题