В этом случае у меня есть экземпляр нейронной сети (NN) в моей базовой рабочей области, который я хочу использовать в симуляции с Simulink. Я обернул использование NN во встроенной функции Matlab входными аргументами, которые должны использоваться сетью.
В принципе, я хотел бы сделать что-то вроде этого:
function XBDDprime = NN(F, XB, XBD, XBDD)
%#eml
global net;
XBDDprime = net([F XB XBD XBDD]');
Там, где целью является получение объекта net
из базовой рабочей области (которая является экземпляром класса network
).
Это колебание проблемы, в которой я использовал evalin
для чтения переменной из рабочей области:
function XBDDprime = NN(F, XB, XBD, XBDD)
%#eml
eml.extrinsic('evalin');
net = evalin('base', 'net'); %Fetch net from workspace
XBDDprime = net([F XB XBD XBDD]'); %Error!
Это не компилируется, потому что кажется, что simulink думает, что net это массив, а net(...)
это подписка на массив (фактическое сообщение об ошибке: подписка на mxArray не поддерживается).
Мне кажется, что Simulink необходимо иметь полное определение любого объекта, который использовался для компиляции встроенной функции matlab, верно? Есть ли решение? Могу ли я каким-то образом использовать Simulink.Signal
, чтобы обернуть NN и добавить его в качестве аргумента в функциональный блок?
Редактировать
Я также пытался использовать load
для загрузки сериализованного объекта net
из файла. Это тоже не сработало. Кажется, это та же проблема, когда компилятор считает s
mxArray
.
function XBDDprime = NN(F, XB, XBD, XBDD)
%#eml
eml.extrinsic('load')
s = load('net');
XBDDprime = s.net([F XB XBD XBDD]');
Решение
Я, наконец, сдался и пошел к функциональному блоку matlab, который может выглядеть как любой из приведенных выше примеров.