• Регистрация
inga
inga 0.00
н/д

Проблема с getFISCodeGenerationData - не принимает строку в качестве входного значения для fis из 2021 года (Specified FIS file contains invalid type-1 membership function)

16.06.2021
Добрый день. Использую мануал https://www.mathworks.com/help/fuzzy/generate-code-for-fuzzy-system-using-matlab-coder.html для генерации кода С++, а именно эту программу: function y = evaluatefis3(file...

Добрый день. Использую мануал https://www.mathworks.com/help/fuzzy/generate-code-for-fuzzy-system-using-matlab-coder.html для генерации кода С++, а именно эту программу:

function y = evaluatefis3(fileName,x)
%#codegen
fis = getFISCodeGenerationData(fileName);
opt = evalfisOptions('NumSamplePoints',51);
y = evalfis(fis,x,opt);
end

с параметрами:

fileName="C:\Users\Inga\YandexDisk\Disser\Programs\segm+features\fis3222.fis";

x1=[76,127,197,240,60,77,71.9762,128.2857,207.9524,207.9524,166.8095,108.0952,29.1339,17.5991,16.0860,48.7545,118.9598,199.2455,199.2455,168.0357,92.5446,1.1667,0.2607,0.4953,0.3376,0.1267,0.0925,0.0546,0.0546,0.0925,0.1267,0.3376];

Результат выдается без ошибок:

y = evaluatefis6(fileName,x1)

y =1.1630

Однако, когда я использую другую нечеткую систему:

fileName="C:/Users/Inga/YandexDisk/Disser/Programs/segm+features/fis3.fis";
x=[76,127,197,240,60,77,71.9762,128.2857,207.9524,207.9524,166.8095,108.0952,29.1339,17.5991,16.0860,48.7545,118.9598,199.2455,199.2455,168.0357,92.5446,1.1667,0.0625,1.381977,0.074565,42.017185,0.57387,0.2607,0.4953,0.3376,0.1267,0.0925,0.0546,0.0546,0.0925,0.1267,0.3376];
y = evaluatefis6(fileName,x)

Появляется ошибка
Error using fuzzy.internal.codegen.readFISAsHomogenousStructure>getVarInfo (line 220)
Specified FIS file contains invalid type-1 membership function.

Error in fuzzy.internal.codegen.readFISAsHomogenousStructure (line 58)
inputInfo = getVarInfo(fid,maxLineLength,newLine,'[Input',false);

Error in getFISCodeGenerationData (line 49)
fisout = fuzzy.internal.codegen.readFISAsHomogenousStructure(fisin);

Error in evaluatefis6 (line 4)
fis = getFISCodeGenerationData(fileName);

Отличия fis3222 от fis3 в том, что первая была создана в апреле 2020 года, а вторая - в июне 2021. Первая работает с вектором размерностью 32, а вторая - с размерностью 37.

Сходства - обе fis были сохранены при помощи writeFIS, созданы и сохранены в одной программе Matlab (2019b) и на одном компьютере. Обе созданы при помощи одного кода и при помощи субстрактивной кластеризации с одинаковыми параметрами.

Более новая fis начинает работать только при добавлении в код функции readfis. Проблема в том, что функцию readfis нельзя сгенерировать в С++

function y = evaluatefisfuck2(fileName,x)
%#codegen
%#internal
fisObject = readfis(fileName);
fis = getFISCodeGenerationData(fisObject);
opt = evalfisOptions('NumSamplePoints',51);
y = evalfis(fis,x,opt);
end

Я прочитала мануал по функции getFISCodeGenerationData, входное значение может быть вектором символов:

fisIn- Входной объект системы нечеткого вывода | объект | объект | объект | строка | вектор символов

Вопрос - с чем связана ошибка?

Теги

      16.06.2021

      Комментарии

      • inga
        inga0.00
        16.06.2021 13:56

        Проблема решена. Пока формулировала вопрос, подумала, что проблема находится не в функции getFISCodeGenerationData, а проблема в fis. Вернее, в genfis2 - именно ее я использовала для субтрактивной кластеризации. Я обучила новую fis не при помощи genfis2, а при помощи genfis. И функция стала работать! Хотя старая fis обучена при помощи genfis2 и прекрасно работает!