How can I access a matlab/octave module from python?


Question

I am looking for a way to access a matlab module from python. My current situation is this:

  • I have a python code that does numerical computations by calling Lapack routines while the memory is allocated as ctypes and passed as pointers to the Lapack routines.
  • I also have a matlab module, which is compatible with octave, that does some mathematical tricks I want to use.

My question now is this:
What is an efficient way to keep all the main work in python while at the same time exploit the possibilities that matlab/octave modules offer. Also it would be kind of nice, if my ctype arrays do not have to be converted into some other object in order to run octave. However, I can see that that last point is hard to accomplish.

My current research shows me two possible options:

  1. Pytave: However it seems that this packages is kind of pre alpha?!
  2. Go this humpy road: ctypes -> *.mat file (via numpy) -> octave -> *.mat file -> ctypes (via numpy)
1
25
10/6/2017 7:57:20 PM

Accepted Answer

Have you considered using OMPC, http://ompc.juricap.com/ ? I have used it with great success when not wishing to re-write some numerical linear algebra routines. I can imagine that the more esoteric the Matlab commands, the harder it would be to translate... but it might be worth a try. In the end, you're going to want to convert your Matlab code to Python because it will be a bottleneck on speed and performance. The only reason to leave the Matlab code in Matlab format is if it would be an enormous up-front cost to translate it all, which OMPC should mitigate somewhat. Otherwise, it's almost always worth that up-front cost to completely rid yourself of Matlab/Octave dependence.

8
5/31/2011 9:44:32 PM

You can use oct2py, which IIUC was started by its author because pytave didn't work on win32. It is successfully used in IPython through its octavemagic extension and I can tell it is easy to use on its own, the code is maintained (I reported a little Unicode bug and the author fixed it in a day) and works well. Most of the times is as simple as:

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

For further examples you can check this blog article.


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon