57

Is it possible to run MATLAB functions from within Python? I search the internet, I could only find PyMat. The bad thing is the compiled version only supports Python2.2 and I am using 2.6. So I tried to download the source code, so I can compile it for myself. But I cannot compile it, VC++ express seems not to have the necessary functionalities to compile it. Does anyone have the compile version for PC? or any substitutes for PyMat? Thanks

Shai
  • 111,146
  • 38
  • 238
  • 371
Hossein
  • 40,161
  • 57
  • 141
  • 175

10 Answers10

33

I know this is an old question and has been answered. But I was looking for the same thing (for the Mac) and found that there are quite a few options with different methods of interacting with matlab and different levels of maturity. Here's what I found:

pymat

A low level interface to Matlab using the matlab engine (libeng) for communication (basically a library that comes with matlab). The module has to be compiled and linked with libeng.

http://pymat.sourceforge.net
Last updated: 2003

pymat2

A somewhat short lived continuation of the pymat development. Seems to work on windows (including 64bit), linux and mac (with some changes).

https://code.google.com/p/pymat2/
Last updated: 2012

mlabwrap

A high level interface that also comes as a module which needs compilation and linking against libeng. It exposes Matlab functions to python so you can do fun stuff like

mlab.plot(x, y, 'o')

http://mlabwrap.sourceforge.net
Last updated: 2009

mlab

A repackaging effort of mlabwrap. Basically it replaces the c++ code that links against 'libeng' in mlabwrap with a python module (matlabpipe) that communicates with matlab through a pipe. The main advantage of this is that it doesn't need compilation of any kind.

Unfortunately the package currently has a couple of bugs and doesn't seem to work on the mac at all. I reported a few of them but gave up eventually. Also, be prepared for lots of trickery and a bunch of pretty ugly hacks if you have to go into the source code ;-) If this becomes more mature it could be one of the best options.

https://github.com/ewiger/mlab
last update: 2013

pymatlab

A newer package (2010) that also interacts with Matlab through libeng. Unlike the other packages this one loads the engine library through ctypes thus no compilation required. Its not without flaws but still being maintained and the (64bit Mac specific) issues I found should be easy enough to fix.
(edit 2014-05-20: it seems those issues have already been fixed in the source so things should be fine with 0.2.4)

http://pymatlab.sourceforge.net
last update: 2014

python-matlab-bridge

Also a newer package that is still actively maintained. Communicates with Matlab through some sort of socket. Unfortunately the exposed functions are a bit limited. I couldn't figure out how to invoke a function that takes structs as parameters. Requires zmq, pyzmq and IPython which are easy enough to install.

http://arokem.github.io/python-matlab-bridge
last update: 2014

Lukas
  • 1,533
  • 16
  • 21
  • 2
    +1 for your post. The question is old (as you said) but still relevant. The older answers are outdated since there is a lot of room for improvement in Matlab-Python cross-talk. – Christian O'Reilly Aug 26 '15 at 22:04
  • 1
    In the spirit of updating older answerd to still relevant questions: Since MATLAB 2014b, Mathworks has included official support for communication between python and matlab: https://se.mathworks.com/help/matlab/matlab-engine-for-python.html – 5Ke Jul 18 '17 at 09:10
29

Another option is Mlabwrap:

Mlabwrap is a high-level python to Matlab® bridge that lets Matlab look like a normal python library.

It works well with numpy arrays. An example from the home page:

>>> from mlabwrap import mlab; from numpy import *
>>> xx = arange(-2*pi, 2*pi, 0.2)
>>> mlab.surf(subtract.outer(sin(xx),cos(xx)))
ars
  • 120,335
  • 23
  • 147
  • 134
  • 1
    This [page](http://obasic.net/how-to-install-mlabwrap-on-windows) contains steps to get started with `mlabwrap` – Amro Aug 03 '12 at 22:08
  • Note that there is also [``mlab``](https://github.com/ewiger/mlab), "a repackaging effort [of mlabwrap] to make things up-to-date". – Florian Brucker Apr 29 '14 at 11:24
  • @FlorianBrucker: mlab is somehow broken, at least it does not work for me correctly... – arc_lupus Feb 11 '15 at 09:27
26

PyMat looks like it's been abandoned.

I'm assuming you are on windows so you could always do the simplest approach and use Matlab's COM interface:

>>> import win32com.client
>>> h = win32com.client.Dispatch('matlab.application')
>>> h.Execute ("plot([0 18], [7 23])")
>>> h.Execute ("1+1")
u'\nans =\n\n     2\n\n'

More info here

Mark
  • 106,305
  • 20
  • 172
  • 230
  • Hey, is there a way to get the Python script to halt if a MATLAB command produces an error or even print out the error? I noticed that Python ignores errors by default and moves on through the script. -Thanks – Usagi Jun 07 '11 at 21:36
  • is the run statement of matlab to run a script executable using this command? – girl101 Mar 28 '18 at 09:31
10

There is a python-matlab bridge which is unique in the sense that Matlab runs in the background so you don't have the startup cost each time you call a Matlab function. https://github.com/jaderberg/python-matlab-bridge

it's as easy as downloading and the following code:

from pymatbridge import Matlab
mlab = Matlab(matlab='/Applications/MATLAB_R2011a.app/bin/matlab')
mlab.start()
res = mlab.run('path/to/yourfunc.m', {'arg1': 3, 'arg2': 5})
print res['result']

where the contents of yourfunc.m would be something like this:

%% MATLAB
function lol = yourfunc(args)
    arg1 = args.arg1;
    arg2 = args.arg2;
    lol = arg1 + arg2;
end
Max Jaderberg
  • 562
  • 5
  • 10
  • Max, do you know if there is a way to pass multiple arguments to the matlab function without using a dictionary? That would be very handy! Thank you! – Barmaley Jan 27 '15 at 22:53
3

I would like to add one more option to the excellent summary by Lukas:

matlab_wrapper

The advantage of matlab_wrapper is that it is pure Python library and you will not need to compile anything. Works in GNU/Linux, Windows and OSX.

https://github.com/mrkrd/matlab_wrapper

Disclaimer: I'm the author of matlab_wrapper

3

see this page: An Open-Source MATLAB®-to-Python® Compiler

Mr.Wizard
  • 24,179
  • 5
  • 44
  • 125
ying17zi
  • 492
  • 6
  • 15
  • Does it support only up to python 2.6? – gc5 Jun 12 '13 at 14:51
  • 1
    @Francesco, sorry I do not know! I just tried some simple examples about two years ago. I've been using both matlab and python. I just stick to certain data structures, and pass data between them. – ying17zi Jun 12 '13 at 19:40
3

You can use the official matlab engine by installing Matlab, then building python engine from its extern files. You can check the guide website below: ---Thanks for the advice in the first comment of this answer --- the essential step in brief are (On Windows platform, other can checked in the url below): 1. download and then install matlab, the version must be R2014 or later. 2. open a PowerShell window under admin, then:

cd "matlabroot\extern\engines\python"

3. use command-line below to install:

python setup.py install

The admin is essential, or you'll fail to build it.

For more information, you can click the official start sheet below: http://cn.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html

H.S.Xu
  • 154
  • 1
  • 7
  • While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. - [From Review](/review/low-quality-posts/10178966) – jezrael Nov 12 '15 at 09:27
  • @jezrael Thanks for your advice, I will modify my answer – H.S.Xu Nov 12 '15 at 09:28
2

newer versions of matlab seem to provide a module that allows you to call matlab functions from within python. see here and here.

user3820991
  • 2,310
  • 5
  • 23
  • 32
  • I wrote a tutorial of how to use it with classes - http://www.cloud-rocket.com/2016/08/using-matlab-compiled-class-from-python/ – Meir Tseitlin Sep 01 '16 at 06:49
2

2 more options for you to consider:

  1. Follow the official MATLAB docs: Create a Python Application with MATLAB Code. This will create a Python library that includes MATLAB runtime which you can call from within your Python code.

  2. Run your MATLAB code in GNU Octave then call it from Python using Oct2Py

Ron Kalian
  • 3,280
  • 3
  • 15
  • 23
2

This is the solution from Mathworks.

In your current folder, create a MATLAB script in a file named triarea.m.

function a = triarea(b,h)
a = 0.5*(b.* h);

Meanwhile, you run the python code as follows,

import matlab.engine
eng = matlab.engine.start_matlab()
eng.addpath('your/code/folders/')
ret = eng.triarea(1.0,5.0)
print(ret)
>>> 2.5

Matlab already provides the python module of the engine, to install that you can do the following,

cd matlab_root_folder/extern/engines/python
python setup.py install

You are all done! Tips: you need to be careful about the data type, the engine is not friendly with numpy. You need to convert the data first.

mat_array = matlab.double(list(my_numpy_array))
eng.my_matlabe_function(mat_array )
Albert Chen
  • 1,331
  • 1
  • 12
  • 13