Сгенерируйте код для нечеткой системы Используя MATLAB Coder

Можно сгенерировать код для оценки нечеткой системы вывода с помощью MATLAB® Coder™. Для получения дополнительной информации о генерации кода смотрите Генерацию кода (MATLAB Coder).

Чтобы сгенерировать код для оценки нечетких систем, необходимо сначала создать нечеткую систему вывода (FIS). Для получения дополнительной информации смотрите Сборку Нечеткие Системы в Командной строке и Сборке Нечеткие Системы Используя Fuzzy Logic Designer.

Генерация кода с помощью MATLAB Coder не поддерживает объекты sugfis или mamfis. Чтобы сгенерировать код для оценки нечетких систем, необходимо преобразовать нечеткие системные объекты вывода в гомогенные структуры с помощью функции getFISCodeGenerationData.

Встройте данные FIS в сгенерированный код

Можно встроить данные для нечеткой системы вывода в сгенерированном коде. Используйте эту опцию, если вы не хотите изменять данные 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:

  1. Оцените файл MEX для одного или нескольких входных значений. Когда вы вызываете файл MEX, задаете ту же структуру FIS, которую вы использовали во время компиляции.

  2. Оцените исходный FIS для тех же входных значений с помощью evalfis. При оценке использования evalfis используйте ту же гомогенную структуру FIS.

  3. Сравните результаты оценки.

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, заданного во время выполнения. В этом случае данные 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

Смотрите также

|

Похожие темы