MATLAB выполнение произвольного кода - PullRequest
0 голосов
/ 14 марта 2010

Я пишу программу автоматического грейдера под Linux. В MATLAB написано несколько классников, поэтому я хочу связать их всех вместе и позволить студентам запустить программу для выполнения задания, и пусть они выберут это задание. Я использую основную программу на C ++, с которой связаны mcc-скомпилированные библиотеки MATLAB.

В частности, моя программа читает конфигурационный файл с именами различных программ matlab и другой информацией. Затем он использует эту информацию для представления выбора студенту. Таким образом, если назначение изменяется, добавляется или удаляется, все, что вам нужно сделать, это изменить файл конфигурации.

Идея состоит в том, что затем программа вызывает правильную библиотеку matlab, скомпилированную с помощью mcc. Но это означает, что библиотеки должны быть перекомпилированы, если изменяется класс. Хуже того, вся программа должна быть перекомпилирована, если грейдер добавлен или удален. Итак, я хотел бы, чтобы одна простая и неизменная функция библиотеки Matlab вызывала m-файлы грейдера напрямую. В настоящее время у меня есть такая библиотека, которая использует eval для строки, переданной ей из основной программы.

Проблема в том, что когда я делаю это, очевидно, mcc впитывает в себя m-код грейдера; изменение кода грейдерного кода после компиляции не имеет никакого эффекта. Я бы хотел, чтобы этого не произошло. Мне стало известно, что Mathworks, возможно, не хочет, чтобы я мог это сделать, поскольку он мог полностью обойти matlab. Это не мое намерение, и я был бы рад решению, которое требует полной установки Matlab.

Мои возможные решения - использовать mex-файл для основной программы или сделать так, чтобы основная программа вызывала mcc-библиотеку, которая затем вызывает mex-файл, который затем вызывает соответствующий класс. Причина, по которой я сомневаюсь в первом решении, заключается в том, что я не уверен, сколько изменений мне придется внести в мой код, чтобы заставить его работать; мой код - C ++, а не C, что, я думаю, усложняет ситуацию. Второе решение, однако, может быть более сложным и, в конечном счете, иметь ту же проблему.

Итак, есть мысли по поводу этой ситуации? Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 15 марта 2010

Вы, кажется, выбрали самый сложный способ решения проблемы. Вот несколько альтернатив:

  1. Ни в коем случае не используйте C / C ++ - напишите программу MATLAB для отображения меню выбора (либо GUI для простого текстового меню в командном окне MATLAB), а затем вызовите соответствующие программы оценивания MATLAB .

  2. Напишите свою программу меню на C / C ++, но вызовите MATLAB, используя аргумент -r для запуска конкретной программы оценки (для ускорения времени запуска используйте параметры -nodesktop, -nojvm или -nodisplay соответственно). ). Однако обратите внимание, что MATLAB будет запускаться заново при каждом выборе меню.

  3. Напишите вашу программу меню на C / C ++ и запустите MATLAB с помощью команды popen (это устанавливает канал между вашей программой C ++ и процессом MATLAB). После выбора пользователем меню:

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

Обновление : Вариант № 3, описанный выше, эффективно работает как движок MATLAB , поэтому вам, вероятно, лучше использовать его напрямую.

0 голосов
/ 14 марта 2010

Не делайте это мекс-функцией.

Используйте обычный m-файл, который должен быть выполнен в matlab. Если вы не хотите сначала запускать Matlab, напишите файл bat. Я полагаю, что -r или -m запускает данную команду (перед запуском функции ml вы должны перейти в правильный каталог)

Для компиляции кода C ++ с использованием mex сначала установите Visual Studio. Затем запустите (в matlab) mex -setup. Выберите «найти установленные компиляторы» или что-то подобное, а затем выберите свой компилятор из списка. Теперь mex скомпилирует код на С ++.

...