Запуск файла .m из скомпилированной функции MATLAB - PullRequest
1 голос
/ 14 сентября 2011

Фон

Скажем, я скомпилировал следующую простую функцию в MATLAB

function foo(path_to_m_file)
  disp([' Running ' path_to_m_file])
  run(path_to_m_file);
end

Функция foo просто берет путь к файлу .m и пытаетсячтобы запустить его.

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

./run_foo.sh $path_to_run_time $path_to_m_file

, где path_to_m_file - это простой .m файлс таким утверждением, как:

a = 2;

Я получаю следующую ошибку:

Error using ==> run
MATLAB:run:FileNotFound

Однако я знаю, что foo получает правильный путь.Например, если я попытаюсь заменить строку с run на следующие две строки, то foo

fID = fopen(conf_file, 'rt');
first_line = textscan(fID, '%s', Inf, 'Delimiter', '\n');

foo прочитает соответствующую строку файла .m.Таким образом, файл .m находится там, и механизм MATLAB может его «увидеть».В самом деле, я даже могу запустить eval на строках, прочитанных с textscan.

Так что мои вопросы:

  1. Почему я получаю ошибку выше?Почему foo не запускает файл .m?

    Обновление: См. Приведенный ниже ответ @ strictrude27, который, кажется, является ответом на этот вопрос.

  2. Если вышеупомянутое не работает.Есть ли способ получить скомпилированную MATLAB функцию для запуска файла .m , который мог измениться после компиляции исходной функции?

Мотивациядля моего второго вопроса:

Я хотел бы иметь возможность "обновить" файл .m, который является частью проекта, без необходимости повторной компиляции всего проекта.Любая идея для этого будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 14 сентября 2011

Из документа компилятора MATLAB :

Скомпилированные приложения не обрабатывают файлы MATLAB во время выполнения

Компилятор MATLAB был разработан таким образом, чтобы вы могли развертывать заблокированные функции. Развертываемые файлы MATLAB приостанавливаются или замораживаются в момент их шифрования компилятором MATLAB - они не изменяются с этого момента. Это не означает, что вы не можете развернуть гибкое приложение - это означает, что вы должны разрабатывать свое приложение с учетом гибкости. Если вы хотите, чтобы конечный пользователь мог выбирать между двумя различными методами, например, они оба должны быть скомпилированы в.

MCR работает только с кодом MATLAB, который был зашифрован при сборке компонента. Любая функция или процесс, которые динамически генерируют новый код MATLAB, не будут работать с MCR.

Некоторые наборы инструментов MATLAB, такие как продукт Neural Network Toolbox ™, генерируют код MATLAB динамически. Поскольку MCR выполняет только зашифрованные файлы MATLAB, а Neural Network Toolbox генерирует незашифрованные файлы MATLAB, некоторые функции в Neural Network Toolbox не могут быть развернуты.

Аналогично, функции, которые должны проверять содержимое файла функций MATLAB, не могут быть развернуты. Например, HELP является динамическим и недоступным в развернутом режиме. Вы можете использовать LOADLIBRARY в развернутом режиме, если вы предоставите ему прототип функции MATLAB.

Вместо компиляции функции, которая генерирует код MATLAB, и попытки ее развертывания, выполните следующие задачи:

  1. Запустите код один раз в MATLAB, чтобы получить сгенерированную функцию.

  2. Скомпилируйте код MATLAB с помощью компилятора MATLAB, включая сгенерированную функцию.

Совет : Другой альтернативой использованию EVAL или FEVAL является использование дескрипторов анонимных функций. Если вам требуется возможность создавать код MATLAB для динамической обработки во время выполнения, у ваших конечных пользователей должна быть установлена ​​копия MATLAB.

0 голосов
/ 05 февраля 2015

Вы можете прочитать файл m, построчно и выполнить каждую строку с помощью функции eval ().Существуют ограничения на формат файла m (например, без разрывов строк, каждая строка должна содержать полный оператор MATLAB), но он работает и может добавить вашу среду выполнения внутри скомпилированного приложения.Я использую эту технику, чтобы позволить пользователям определять конфигурацию и файлы данных для скомпилированного приложения, которое я разработал.

Очевидно, что если ваш конечный пользователь предоставит плохо сформированный m-файл для оценки, у вас будет сложность для разрешенияошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...