Кодер Матлаб; Подписка на mxArray не поддерживается.

Используя кодировщик Matlab, я получаю ошибку Subscripting into an mxArray is not supported. в следующей функции:

function net = mlpunpak(net, w)
% Check arguments for consistency
errstring = consist(net, 'mlp');
if ~isempty(errstring);
    error(errstring);
end
nin = net.nin;
nhidden = net.nhidden;
nout = net.nout;

mark1 = nin*nhidden;
net.w1 = reshape(w(1:mark1), nin, nhidden);
mark2 = mark1 + nhidden;
net.b1 = reshape(w(mark1 + 1: mark2), 1, nhidden);
mark3 = mark2 + nhidden*nout;
net.w2 = reshape(w(mark2 + 1: mark3), nhidden, nout);
mark4 = mark3 + nout;
net.b2 = reshape(w(mark3 + 1: mark4), 1, nout);'  

Я пробовал разные решения, которые мог найти в сети, но ни одно из них не сработало (например: использование coder.extrinsic('reshape'), инициализация net.w1 нулями....) Кто-нибудь знает, как это исправить?


person Ali Jooya    schedule 07.05.2015    source источник
comment
Можете ли вы предоставить свой скрипт сборки? Возможно проблема с объявлениями параметров.   -  person Tony    schedule 08.05.2015
comment
Кроме того, используете ли вы «внешний» в других местах своего кода? Не могли бы вы предоставить всю функцию?   -  person Tony    schedule 08.05.2015
comment
Как сказал @Tony, где-то есть вызов внешней функции, выходные данные которой индексируются. Документация описывает, как преобразовать mxArray значения (т. е. вывод внешних вызовов) в известные типы, такие как double или int32. Этот ответ также описывает ситуацию.   -  person Ryan Livingston    schedule 08.05.2015
comment
@Tony: у меня нет скрипта сборки. Как я могу создать, объявить и добавить скрипт сборки в свой проект? Вот что я пытаюсь скомпилировать: Файл точки входа содержит функцию с тремя входами. Я определил тип входных параметров в кодере. Внутри этой функции я вызываю другие функции из пакета, который я получил онлайн (исходный код Netlab и папка, содержащая пакет, добавляются к пути Matlab), и эти функции вызывают другие функции из пакета.   -  person Ali Jooya    schedule 08.05.2015
comment
Как отмечает @lilbill39, тип mxArray проявляется в возвращаемых значениях функций, объявленных внешними. Ответ, который он цитирует, покажет вам, как убедиться, что эти переменные правильно типизированы, чтобы вы могли их использовать.   -  person Tony    schedule 08.05.2015
comment
@Tony: я добавил весь код в исходный пост.   -  person Ali Jooya    schedule 08.05.2015
comment
@ lilbill39: я нигде в коде не использую вызов внешней функции. Я не уверен, что Coder автоматически использует их для неподдерживаемых функций.   -  person Ali Jooya    schedule 08.05.2015
comment
Вы можете экспортировать скрипт сборки из пользовательского интерфейса MATLAB Coder, что может быть полезно, чтобы увидеть, что здесь происходит. Пользовательский интерфейс — это хорошее место для начала создания кода, но обычно полезно использовать сценарии сборки при диагностике проблем.   -  person Tony    schedule 08.05.2015
comment
Также проверьте внутри функции consist любые внешние вызовы, так как это не стандартная функция MATLAB. Насколько я знаю, это единственный способ получить типы mxArray, если только в объявлениях ввода нет чего-то. В любом случае исправление, описанное в ответе @lilbill39, должно решить вашу проблему.   -  person Tony    schedule 08.05.2015
comment
@AliJooya Некоторые функции вызываются внешне автоматически, как графические функции. Идея, запустить кодер, чтобы ошибка возникла. Затем где-то должна быть ссылка с надписью «Просмотреть отчет об ошибке» или «Открыть отчет об ошибке» либо в пользовательском интерфейсе, либо в командном окне. Нажмите на нее, чтобы открыть отчет в формате html и найти подчеркнутое красным место ошибки в этом отчете. Наведите указатель мыши на индексируемую переменную, чтобы убедиться, что это mxArray. Используйте отчет, чтобы проследить эту переменную до ее первого назначения, чтобы увидеть, где был введен mxArray. Возможно, вам придется отслеживать его через вызовы функций.   -  person Ryan Livingston    schedule 08.05.2015
comment
@AliJooya Глядя на весь код, единственная индексируемая переменная — это w. Так что вы можете посмотреть на это, используя отчет codegen. Возможно, что mxArray вводится в функцию, вызывающую mlpunpak.   -  person Ryan Livingston    schedule 09.05.2015
comment
@ lilbill39, благодаря вашим предложениям я нашел корень проблемы. В моем файле ввода мне нужно прочитать некоторые переменные (матрицы) из файлов .m. Например, я храню M1 в Input.m следующим образом: 'M1=[1 2 3 4 5 6 7 8 9];' И я прочитал это в своем входном файле следующим образом: 'Input.m;' Чтобы использовать кодировщик, мне пришлось изменить его на coder.load(), который возвращает тип структуры. Копирование части этой матрицы в другую переменную делает эту переменную типа mxArray. Любое предложение, как читать переменные, хранящиеся в файле .m, как двойные?   -  person Ali Jooya    schedule 09.05.2015
comment
@AliJooya Я бы рекомендовал хранить данные в файле MAT. Итак, запустите save data.mat M1 в MATLAB с определенным M1. Затем в вашей точке входа используйте data = coder.load('data.mat'); M1 = data.M1;. Использование coder.load не требует объявления coder.extrinsic.   -  person Ryan Livingston    schedule 09.05.2015