Подтвердить что ты не робот

Как я могу получить доступ к модулю matlab/октавы из python?

Я ищу способ получить доступ к модулю matlab из python. Моя текущая ситуация такова:

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

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

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

  • Pytave: Однако кажется, что это пакеты вроде pre alpha?!
  • Перейдите по этой дороге: ctypes → *.mat(через numpy) → octave → *.mat file → ctypes (через numpy)
4b9b3361

Ответ 1

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

Ответ 2

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

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

Для дальнейших примеров вы можете проверить эту статью в блоге.

Ответ 3

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

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

from hashlib import md5

Позже в yacc.py script, на строке 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), я выполнил поиск в googled и заменил существующий script на более новую версию.