Можно сгенерировать код для оценки системы нечеткого вывода с помощью Coder™ MATLAB ®. Для получения дополнительной информации о генерации кода смотрите Code Generation (MATLAB Coder).
Чтобы сгенерировать код для оценки нечетких систем, необходимо сначала создать систему нечеткого вывода (FIS). Для получения дополнительной информации смотрите Создание нечетких систем в командной строке и Создание нечетких систем с помощью Fuzzy Logic Designer.
Хотя этот пример генерирует код для системы нечеткого вывода Mamdani типа 1, рабочий процесс также применяется к нечетким системам Sugeno и type-2.
Генерация кода с помощью MATLAB Coder не поддерживает нечеткие объекты FIS (mamfis
, sugfis
, mamfistype2
, sugfistype2
). Чтобы сгенерировать код для оценки нечетких систем, необходимо преобразовать системные объекты нечеткого вывода в однородные структуры с помощью getFISCodeGenerationData
функция.
Можно встраивать данные для системы нечеткого вывода в сгенерированный код. Используйте эту опцию, если вы не хотите изменять данные FIS после компиляции.
Во-первых, создайте нечеткую систему или загрузите нечеткую систему из .fis
файл. В данном примере загружает нечеткую систему из tipper.fis
.
fisObject = readfis("tipper.fis");
Чтобы использовать эту FIS для генерации кода, преобразуйте ее в однородную структуру.
fis = getFISCodeGenerationData(fisObject);
По умолчанию getFISCodeGenerationData
принимает, что объект FIS является системой типа 1. Для генерации кода для системы типа 2 необходимо указать системный тип с помощью getFISCodeGenerationData(fisObject,"type2")
.
Создайте функцию для оценки нечеткой системы fis
для заданного входного вектора x
. В рамках этой функции можно задать опции для evalfis
функция, использующая evalfisOptions
.
function y = evaluatefis1(fis,x) %#codegen opt = evalfisOptions('NumSamplePoints',51); y = evalfis(fis,x,opt); end
Сгенерируйте код для evaluatefis1
, указывая, что fis
входной параметр является постоянным. Можно задать различные целевые объекты для сборки, такие как статическая библиотека, исполняемый файл или файл MEX. В данном примере сгенерируйте файл MEX.
codegen('evaluatefis1','-args',{coder.Constant(fis),[0 0]},'-config:mex')
Code generation successful.
Чтобы проверить выполнение файла MEX:
Оцените файл MEX для одного или нескольких входных значений. При вызове файла MEX задайте ту же структуру FIS, которую вы использовали во время компиляции.
Оцените исходные FIS для тех же входных значений с помощью evalfis
. При оценке с помощью evalfis
, использовать ту же однородную структуру FIS.
Сравните результаты оценки.
mexOutput1 = evaluatefis1_mex(fis,[7 9])
mexOutput1 = 21.0327
opt = evalfisOptions('NumSamplePoints',51);
evalfisOutput = evalfis(fis,[7 9],opt)
evalfisOutput = 21.0327
Выходные данные файла MEX совпадают с evalfis
выход.
Кроме того, можно встраивать данные FIS в сгенерированный код путем чтения данных FIS из файла во время генерации кода. Задайте функцию для оценки нечеткой системы для заданного входного вектора x. В рамках этой функции считайте данные FIS из файла tipper.fis
.
function y = evaluatefis2(x) %#codegen fis = getFISCodeGenerationData('tipper.fis'); opt = evalfisOptions('NumSamplePoints',51); y = evalfis(fis,x,opt); end
Сгенерируйте код для evaluatefis2
.
codegen('evaluatefis2','-args',{[0 0]},'-config:mex')
Code generation successful.
Проверьте выполнение файла MEX с помощью тех же входных значений для x
. В этом случае вы не должны задавать исходную структуру FIS, используемую во время компиляции.
mexOutput2 = evaluatefis2_mex([7 9])
mexOutput2 = 21.0327
evalfisOutput
evalfisOutput = 21.0327
Можно сгенерировать код для оценки FIS, который считывается из .fis
файл, заданный во время выполнения. В этом случае данные FIS не встраиваются в сгенерированный код. Задайте функцию для оценки нечеткой системы, заданной в указанном файле fileName
для заданного входного вектора x
.
function y = evaluatefis3(fileName,x) %#codegen fis = getFISCodeGenerationData(fileName); opt = evalfisOptions('NumSamplePoints',51); y = evalfis(fis,x,opt); end
Определите типы входных данных для этой функции.
fileName = coder.newtype('char',[1 Inf],[false true]); x = coder.newtype('double',[1 Inf],[false true]);
Сгенерируйте код для evaluatefis3
.
codegen('evaluatefis3','-args',{fileName,x},'-config:mex')
Code generation successful.
Проверьте выполнение файла MEX с помощью тех же входных значений для x
. В этом случае вы задаете имя .fis
файл.
mexOutput3 = evaluatefis3_mex('tipper.fis',[7 9])
mexOutput3 = 21.0327
evalfisOutput
evalfisOutput = 21.0327
Каждый раз, когда вы бегаете evaluatefis3
, он перезагружает нечеткую систему из файла. Для вычислительной эффективности можно создать функцию, которая только загружает FIS, когда задано новое имя файла.
function y = evaluatefis4(fileName,x) %#codegen %#internal persistent fisName fis if isempty(fisName) [fisName,fis] = loadFIS(fileName); elseif ~strcmp(fisName,fileName) [fisName,fis] = loadFIS(fileName); end opt = evalfisOptions('NumSamplePoints',51); y = evalfis(fis,x,opt); end function [fisName,fis] = loadFIS(fileName) fisName = fileName; fis = getFISCodeGenerationData(fisName); end
Сгенерируйте evaluatefis4 кода
. Типы входных данных для этой функции те же, что и для evaluatefis3
.
codegen('evaluatefis4','-args',{fileName,x},'-config:mex')
Code generation successful.
Проверьте выполнение файла MEX с тем же именем файла с входом значениями.
mexOutput4 = evaluatefis4_mex('tipper.fis',[7 9])
mexOutput4 = 21.0327
evalfisOutput
evalfisOutput = 21.0327
Предыдущие примеры сгенерировали код для данных двойной точности. Чтобы сгенерировать код для данных с одной точностью, задайте тип данных входных значений следующим single
. Для примера сгенерируйте код для evaluatefis2
использование данных с одной точностью.
codegen('evaluatefis2','-args',{single([0 0])},'-config:mex')
Code generation successful.
Проверьте выполнение файла MEX, передав значения с одной точностью входа.
mexOutputSingle = evaluatefis2_mex(single([7 9]))
mexOutputSingle = single
21.0327
evalfisOutput
evalfisOutput = 21.0327
evalfis
| getFISCodeGenerationData