Python for Matlab users

Python has a number of benefits over Matlab, and a number of research groups are making the switch. I’m not going to do a complete tutorial here on how to programme in python for Matlab users since there are plenty on the web. Instead I wanted to make a few note on the practical aspects such as IDEs and how to use python.

I’m running python on Mint linux but most of this should be applicable to Windows and Macs.

  • There are several types of python implementation such as CPython, Anaconda, Python(x,y). CPython is the original and probably the best to start with since it probably is the one that comes with your Linux distro. Normal Python compiles into bytecode, other implementations can compile into C (Cython, not to be confused with CPython), .NET (IronPython) among others. Unless you have good reason stick with CPython.
  • There are two slightly incompatible version of Python: 2.x and 3.x.  Which one to use, depends on who you ask. I’ve picked 3 since it’s the future. You’ll probably need to know the differences at some point since there’s a lot 2.x around.
  • Python vs iPython. Python scripts can be run from the command line, eg. python script.py  or you can use the interactive shell by simply running python. ipython is a souped up version of the interactive shell and has additional functionality. It it more like the Matlab command prompt and is the one to use when writing scripts.
  • IDEs. There are a lot of IDEs for python. I don’t think any of them are as good as the Matlab IDE just yet. Spyder is probably the closest.
  • Instead of toolboxes, Python has packages. These can be installed a number of ways. If you are running Linux your distro will have most of the more common ones that can be installed via apt-get or its equivalent. These packages will be installed system wide and probably be slightly out of date but possibly safer. Another method is to use the Python package index PyPi and uses the program pip to install them. pip will have a larger, more up to date database of packages. It also has the ability to restrict the download to your user space only or use a completely self-contained environment virtualenv to run your scripts in. Great if you need incompatible versions for different projects or don’t want to screw up other projects. I would recommend looking into this.
  • When installing using apt-get, you’ll need suffix package names with a 3 to get the python 3 version, otherwise it will install version 2. It’s the same with spyder, install spyder3. Some packages work with 2 and 3 so there’s only one version to add to the confusion.

Plotting and images

  • A graphically plotting library matplotlib is provided and is similar to Matlab
  • In ipython plots maybe inline (i.e displayed in the console). If you don’t want this run
    %matplotlib qt and  %matplotlib inline to return to inline.

Matrices and computer vision

  • Matlab’s raison d’être is matrix manipulation and but by itself python’s support is limited. Conveniently there is a package that however supports this called numpy which is part of scipy and that provides a huge scientific library. Sympy can be used for symbolic maths manipulation. It’s the numpy library that makes python such useful replacement for Matlab.
  • As far as replacing the image processing and computer vision toolboxs, there is a range of options. Opencv has a python wrapper, which conveniently uses numpy arrays to hold images. You’ll need opencv 3 to get python 3 support. Scikit-image has a huge collection of routines. They both use numpy arrays so you can use both at once although you will have to covert the data types. Another option is Pillow which is forked from the defunct PIL library.

Getting Matlab 2012b to work with XCode 5 (OS X 10.9 Maverick)

Mathworks haven’t issued a patch for 2012b and OS X 10.9 so I ran the 10.9 patch (from http://www.mathworks.com/matlabcentral/answers/94092) and ran

mex -setup

I then modified the mexopts.sh file (mex -setup tells you where this is, on my system its

edit ~/.matlab/R2012b/mexopts.sh

In the section called

#PATCH: MacOSX10.8

remove the version numbers from CC and CXX and correct the SDKROOT. I also changed the deployment target to 10.9

#PATCH: MacOSX10.8

CC='llvm-gcc'
CXX='llvm-g++
SDKROOT='/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/'
MACOSX_DEPLOYMENT_TARGET='10.9'

After a restart, mex worked fine.

OpenCV and Matlab

I’m experimenting with using OpenCV and Matlab and have come across a problem. Matlab (at least on my Mac) loads its own versions of libraries preferentially. This isn’t normally a problem but if your mex code links against a different version you might get a library conflict. One that I have come across several times is Matlab uses an old version of libtiff (it’s used in imread, imwrite etc) and OpenCV uses a newer version. So when I run an OpenCV mex file, Matlab attempts to load the old version for my OpenCV and the mex file crashes.

My first attempt to solve this was to update the Matlabs version of libtiff – it partially worked. My libraries were fine but it broke imread so it wasn’t acceptable. The solution I found when trying the mexopencv wrapper is to preload the up to date libraries when starting Matlab. The command was

DYLD_INSERT_LIBRARIES=/opt/local/lib/libtiff.5.dylib /Applications/Matlab/MATLAB_R2012b.app/bin/matlab &