Можно сгенерировать код для оценки нечеткой системы вывода с помощью MATLAB® Coder™. Для получения дополнительной информации о генерации кода смотрите Генерацию кода (MATLAB Coder).
Чтобы сгенерировать код для оценки нечетких систем, необходимо сначала создать нечеткую систему вывода (FIS). Для получения дополнительной информации смотрите Сборку Нечеткие Системы в Командной строке и Сборке Нечеткие Системы Используя Fuzzy Logic Designer.
В то время как этот пример генерирует код для типа 1 Mamdani нечеткая система вывода, рабочий процесс также применяется к Sugeno и типу 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')
Проверять выполнение файла 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')
Проверьте выполнение файла 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')
Проверьте выполнение файла 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')
Проверьте выполнение файла 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')
Проверьте выполнение файла MEX, передающее во входных значениях с одинарной точностью.
mexOutputSingle = evaluatefis2_mex(single([7 9]))
mexOutputSingle = single
21.0327
evalfisOutput
evalfisOutput = 21.0327
evalfis
| getFISCodeGenerationData