Можно сгенерировать код для оценки нечеткой системы вывода с помощью MATLAB® Coder™. Для получения дополнительной информации о генерации кода смотрите Генерацию кода (MATLAB Coder).
Чтобы сгенерировать код для оценки нечетких систем, необходимо сначала создать нечеткую систему вывода (FIS). Для получения дополнительной информации смотрите Сборку Нечеткие Системы в Командной строке и Сборке Нечеткие Системы Используя Fuzzy Logic Designer.
Генерация кода с помощью MATLAB Coder не поддерживает объекты sugfis
или mamfis
. Чтобы сгенерировать код для оценки нечетких систем, необходимо преобразовать нечеткие системные объекты вывода в гомогенные структуры с помощью функции getFISCodeGenerationData
.
Можно встроить данные для нечеткой системы вывода в сгенерированном коде. Используйте эту опцию, если вы не хотите изменять данные FIS после компиляции.
Во-первых, создайте нечеткую систему или загрузите нечеткую систему из файла .fis
. В данном примере загрузите нечеткую систему от tipper.fis
.
fisObject = readfis("tipper.fis");
Чтобы использовать этот FIS для генерации кода, преобразуйте его в гомогенную структуру.
fis = getFISCodeGenerationData(fisObject);
Создайте функцию для оценки нечеткой системы 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