Вставить функцию из файла Matlab MEX непосредственно в Python - PullRequest
7 голосов
/ 27 июля 2011

Я использую проприетарный файл Matlab MEX для импорта некоторых результатов симуляции в Matlab (конечно, исходный код недоступен!). Интерфейс с Matlab на самом деле очень прост, так как есть одна функция, возвращающая структуру Matlab. Я хотел бы знать, есть ли способ вызвать эту функцию в файле MEX непосредственно из Python, без необходимости использовать Matlab?

Я имею в виду, например, использование чего-то вроде SWIG для импорта функции C в Python, предоставляя для нее настраиваемую оболочку Matlab ... Между прочим, я знаю, что с scipy.io.loadmat уже возможно читать двоичные файлы данных Matlab * .mat, но я не знаю, совпадает ли представление данных в файле mat с внутренним представлением в Matlab (в этом случае это может быть полезно для оболочки MEX).

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

Спасибо.

Ответы [ 4 ]

2 голосов
/ 12 августа 2011

Вы можете создавать отдельные разделяемые библиотеки из кода Matlab, например, http://www.mathworks.com/help/toolbox/compiler/mbuild.html. Это вы должны иметь возможность вызывать из Python.Но вам нужен Matlab Compiler, однако, похоже, что его пробная версия доступна бесплатно.

См. Также эту тему stackoverflow .

2 голосов
/ 27 июля 2011

Если я не пойму что-то о том, как работает Matlab, или о вашем вопросе, это вряд ли возможно. С технической точки зрения любое решение должно быть полной, бинарно-совместимой, с ошибкой для исправления ошибок, функцией для повторной реализации функций библиотеки Matlab C (реализующей mxGetPr, mxGetN и т. Д.), Но с привязкой к Python.

Позвольте мне отредактировать свой собственный ответ, сказав следующее: Если у вас есть лицензия MATLAB, есть отличный пакет MLAB wrap , который выполняет хотя бы часть того, что вы хотите.

1 голос
/ 24 июня 2012

Mex-функция - это API, который позволяет Matlab (то есть программе Matlab) вызывать функцию, написанную на c / c ++. Эта функция, в свою очередь, может вызывать собственные внутренние функции Matlab. Таким образом, функция mex будет связана с библиотеками Matlab. Таким образом, вызвать mex-функцию напрямую из программы на Python без библиотек Matlab не представляется возможным (и не имеет смысла в этом отношении).

Следует рассмотреть вопрос, почему функция mex была создана в первую очередь? Было ли это для того, чтобы сделать некоторые нематлабные c библиотеки (или c code) доступными для пользователей matlab, или это было скрыть некоторый propritery matlab-код, все еще делая его доступным для пользователей matlab? Если это первый случай, вы могли бы попросить владельцев функции mex предоставить ее в не-mex динамической форме lib, которую вы можете включить в другую программу на языке c или python. Это должно быть легко, если функция mex не зависит от внутренних функций Matlab.

Другие выше упоминали компилятор matlab ... да, вы можете включить функцию mex в отдельный двоичный файл, вызываемый из unix (то есть из python, но как вызов unix), если вы используете компилятор Matlab для создания такого двоичного файла. Это потребует развертывания двоичного файла вместе со средой выполнения Matlab. Это не совсем то же самое, что вызов функции напрямую из python - например, нет возвращаемых значений.

1 голос
/ 02 декабря 2011
  1. Вы можете построить библиотеку из mex-файла, как указал Мауро
  2. Вы можете безопасно использовать scipy.io.loadmat, представление данных:

из:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html

Возвращает:

mat_dict: dict

словарь с именами переменных в качестве ключей и загруженными матрицами в качестве значений

Загруженные матрицы соответствуют тому, как вы их сохранили, т.е. представление данных должно быть согласованным.

...