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

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

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

В то время как этот пример генерирует код для типа 1 Mamdani нечеткая система вывода, рабочий процесс также применяется к Sugeno и типу 2 нечеткие системы.

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

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

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

  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

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

|

Похожие темы