¿Cómo puedo acceder a un módulo matlab / octave desde python?


Estoy buscando una manera de acceder a un módulo matlab desde python. Mi situación actual es la siguiente:

  • Tengo un código python que hace cálculos numéricos llamando a rutinas Lapack mientras que la memoria se asigna como ctypes y se pasa como punteros a las rutinas Lapack.
  • También tengo un módulo matlab, que es compatible con octave, que hace algunos trucos matemáticos que quiero usar.

Mi pregunta ahora es esta:
¿Cuál es una manera eficiente de mantener trabajo principal en python mientras que al mismo tiempo explotar las posibilidades que ofrecen los módulos matlab/octave. También sería algo bueno, si mis matrices ctype no tienen que convertirse en algún otro objeto para ejecutar octave. Sin embargo, puedo ver que este último punto es difícil de lograr.

Mi investigación actual me muestra dos opciones posibles:

  1. Pytave: Sin embargo, parece que este paquete es una especie de pre alfa?!
  2. Siga este camino humpy: ctypes -> *.estera archivo (vía numpy) - > octava ->*.archivo mat - > ctypes (vía numpy)
Author: ROMANIA_engineer, 2011-05-26

3 answers

¿Ha considerado usar la OMPC, http://ompc.juricap.com / ? Lo he usado con gran éxito cuando no deseaba reescribir algunas rutinas de álgebra lineal numérica. Me imagino que cuanto más esotéricos sean los comandos de Matlab, más difícil será traducirlos... pero podría valer la pena intentarlo. Al final, querrá convertir su código Matlab a Python porque será un cuello de botella en velocidad y rendimiento. La única razón para dejar el código Matlab en formato Matlab es si sería un enorme costo inicial traducirlo todo, que la OMPC debería mitigar un poco. De lo contrario, casi siempre vale la pena ese costo inicial para deshacerse por completo de la dependencia de Matlab/Octave.

 8
Author: ely,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-31 21:44:32

Puedes usar oct2py, que IIUC fue iniciado por su autor porque pytave no funcionó en win32. Se utiliza con éxito en IPython a través de su extensión octavemagic y puedo decir que es fácil de usar por sí solo, el código se mantiene (informé de un pequeño error de Unicode y el autor lo arregló en un día) y funciona bien. La mayoría de las veces es tan simple como:

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

Para obtener más ejemplos, puede consultar este artículo del blog.

 19
Author: astrojuanlu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-05 11:09:45

Tuve algunos problemas para que la OMPC funcionara porque (I) el módulo md5 está obsoleto, (II) Python 2.6 y posteriores ya no aceptan argumentos para Object.__ new__ () u Object.__ init_ _ (), y (III) el byteplay.py el script necesitaba ser actualizado.

Para resolver el problema (I), cambié la línea 74 de yacc.py se encuentra en el directorio ompc/. Esta línea importa md5 entre otras cosas. Eliminé el módulo md5 y agregué la siguiente línea:

from hashlib import md5

Más tarde en el yacc.py guión, en la línea 1160, I cambiado,

Signature = md5.new()

A lo siguiente,

Signature = md5()

Para ejecutar el código generado por ompcply.py, agregue 'from ompc import *' al principio del archivo y luego ejecútelo con una versión anterior de Python, como:

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

Usar una versión de Python posterior a 2.5 le dará el siguiente error:

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

Para resolver el problema (III) busqué en Google byteplay, y reemplazé el script existente con la versión más reciente.

 3
Author: cjohnson318,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-05 18:45:16