Выполнение произвольного кода MATLAB

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

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

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

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

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

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


person user293469    schedule 14.03.2010    source источник


Ответы (3)


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

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

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

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

    • your C++ program writes the name of the MATLAB program (and any parameters) to the pipe.
    • На стороне MATLAB напишите программу MATLAB для блокирующего чтения на этом конвейере. Когда он читает команду, он вызывает соответствующую функцию MATLAB.
    • Вы также можете использовать именованные каналы. Подробнее см. в этой группе новостей MATLAB.

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

person Gautam Vallabha    schedule 15.03.2010

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

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

Чтобы скомпилировать код C++ с помощью mex, сначала установите Visual Studio. Затем запустите (в Matlab) mex -setup. Выберите найти установленные компиляторы или что-то подобное, а затем выберите свой компилятор из списка. Теперь mex будет компилировать код C++.

person KitsuneYMG    schedule 14.03.2010