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

Можно сгенерировать код для оценки системы нечеткого вывода с помощью 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 после компиляции.

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

  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')
Code generation successful.

Проверьте выполнение файла 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')
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

См. также

|

Похожие темы