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:

- Pytave: However it seems that this packages is kind of pre alpha?!
- Go this humpy road: ctypes -> *.mat file (via numpy) -> octave -> *.mat file -> ctypes (via numpy)

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.

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