Как я могу получить доступ к модулю matlab / octave из python? - PullRequest
25 голосов
/ 26 мая 2011

Я ищу способ доступа к модулю Matlab из Python. Моя текущая ситуация такова:

  • У меня есть код Python, который выполняет численные вычисления, вызывая подпрограммы Лапака, в то время как память выделяется как ctypes и передается в виде указателей на подпрограммы Лапака.
  • У меня также есть модуль matlab, совместимый с октавой, который выполняет некоторые математические приемы, которые я хочу использовать.

Мой вопрос сейчас такой:
Что является эффективным способом сохранить всю основную работу в Python и в то же время использовать возможности, которые предлагают модули matlab / octave. Также было бы неплохо, если бы мои массивы ctype не нужно было преобразовывать в какой-то другой объект для запуска октавы. Тем не менее, я вижу, что этот последний пункт трудно выполнить.

Мое текущее исследование показывает мне два возможных варианта:

  1. Pytave : Однако кажется, что эти пакеты являются своего рода пре-альфа?!
  2. Пройдите по этой неповоротливой дороге: ctypes -> * .mat file (через numpy) -> октава -> * .mat file -> ctypes (via numpy)

Ответы [ 3 ]

20 голосов
/ 05 мая 2013

Вы можете использовать oct2py , который IIUC был запущен его автором, потому что pytave не работал на win32.Он успешно используется в IPython через расширение octavemagic , и я могу сказать, что его легко использовать само по себе, код поддерживается (я сообщил об небольшой ошибке в Юникоде, и автор исправил ее за день) иработает хорошо.В большинстве случаев это так просто:

>>> from oct2py import octave
>>> octave.run("cos(pi / 3)")
'ans =  0.50000'
>>> octave.call("foo", a, b)  # Function in foo.m

Дополнительные примеры вы можете посмотреть в этой статье блога .

8 голосов
/ 01 июня 2011

Рассматривали ли вы использование OMPC, http://ompc.juricap.com/? Я использовал его с большим успехом, когда не хотел переписывать некоторые процедуры числовой линейной алгебры. Я могу себе представить, что чем более эзотеричны команды Matlab, тем сложнее будет перевести ... но это может стоить попробовать. В конце концов, вы захотите преобразовать свой код Matlab в Python, потому что это будет узким местом по скорости и производительности. Единственная причина оставить код Matlab в формате Matlab состоит в том, что если бы все это было огромной предварительной стоимостью, которую OMPC должен несколько смягчить. В противном случае, это почти всегда стоит того, чтобы полностью избавиться от зависимости Matlab / Octave.

3 голосов
/ 05 июня 2012

У меня возникли проблемы с работой OMPC, потому что (I) модуль md5 устарел, (II) Python 2.6 и более поздние версии больше не принимают аргументы для Object .__ new __ () или Object .__ init __ () и (III)Необходимо обновить скрипт byteplay.py.

Чтобы решить проблему (I), я изменил строку 74 файла yacc.py, находящуюся в каталоге ompc /.Эта строка импортирует MD5 среди прочего.Я удалил модуль md5 и добавил строку ниже:

from hashlib import md5

Позже в скрипте yacc.py, в строке 1160, я изменил

Signature = md5.new()

на следующее,

Signature = md5()

Чтобы запустить код, сгенерированный ompcply.py, добавьте 'from ompc import *' в начало файла, а затем запустите его с более ранней версией Python, как:

$ python2.5 ompcply.py script.m > newscript.pym
$ python2.5 newscript.pym

Использование версии Python более поздней, чем 2.5, приведет к следующей ошибке:

/home/connor/downloads/OMPC/ompclib/ompclib_numpy.py:66: DeprecationWarning: object.__new__() takes no parameters
  a = super(mvar, cls).__new__(cls, *args, **kwargs)

Для решения проблемы (III) я погуглил byteplay и заменил существующий скрипт более новой версией.

...