What is pymatlab ?
Python의 numpy module을 이용하면 간단한 수학 계산등에는 편하지만 좀 만 더 진행하면 matlab의 막강한 function들이 필요해지곤 한다. 그렇다고 matlab만 사용하기에는 programming의 불편함과 다른 module과의 interface가 힘들어지곤 한다. Pymatlab module은 python과 matlab사이에서 데이터를 쉽게 주고 받을 수 있게 함으로써 서로의 장점을 취하고자 하는 module이다. Python과 matlab을 동시에 사용하는 경우 꼭 설치해서 사용해 보면 왜 이런 것을 진작 몰랐을까 하는 마음이 들 정도이다.
아래의 내용들은 window환경에서 python2.6과 numpy 1.4, pymatlab 0.1.3 그리고 MATLAB R2010a을 사용하였다.
Install
pymatlab은 설치하기가 좀 까다롭다. 그렇다고 자세히 설명되어 있는 것도 없어 python module설치하는데 4-5시간이 소요되긴 했지만 결과는 기대이상이다. 아마 pymatlab의 version이 올라가면서 설치가 좀 더 편해지리라 생각한다.
1. 먼저 numpy와 setuptools를 설치한다. Setuptools는 setuptools-0.6c11.win32-py2.6.exe를 구해서 설치하면 되고 여기까지는 별 문제가 없다. 그리고 system path에 C:\Python26\scripts를 꼭 포함시킨다.
2. include 복사
pymatlab 0.1.3을 download해서 압축을 푼 후 pymatlab-0.1.3\src의 directory의 matlab.c을 살펴본다.
#include <numpy/arrayobject.h>
#include <engine.h>
위와 같이 include를 해야 하는데 arrayobject.h는 numpy에서 사용하는 것이고, engine.h는 matlab에 있는 파일이다. 해당 파일들을 찾아 python의 include에 복사한다.
C:\Python26\Lib\site-packages\numpy\core\include에 보면 numpy 디렉토리가 있는데 통째로 C:\Python26\include로 복사한다.
C:\Program Files\MATLAB\R2010a\extern\include에 보면 engine.h와 기타 파일들이 있는데 마찬가지고 통째로 C:\Python26\include로 복사한다.
3. library 복사
Matlab.c를 link하려면 matlab의 library가 필요한데 해당 compiler에 맞는 파일들을 복사해야 한다.
C:\Program Files\MATLAB\R2010a\extern\lib\win32\microsoft에 library 파일들이 여러 개 있는데 모두 C:\Python26\libs로 복사한다.
4. pymatlab을 압축 푼 곳에서 “python setup.py install”을 수행시킨다.
Error 발생시 위의 2,3과정을 다시 꼼꼼히 살핀다. 여기까지 성공하면 힘든 과정은 다 끝나고 마지막 path만 설정하면 된다.
5. 이제 마지막 단계로 system path에 matlab DLL 위치를 포함시켜야 한다.
C:\Program Files\MATLAB\R2010a\bin\win32에 matlab이 사용하는 DLL이 있는데 이 path를 system path에 포함한다.
(새로 설치한 환경에서의 errror)
VC++2010 (express version도 마찬가지)이 깔려 있는 환경에서 위의 과정을 수행하면 아래와 같은 error가 발생한다.
building 'pymatlab.matlab' extension
error: Unable to find vcvarsall.bat
이는 python2.6, python2.7 visual studio 2008로 compile되어서 그렇다.
2010을 지우고 2008을 깔고 수행하면 된다.
참고로 새로 install한 환경은 python2.7과 MATLAB R2008b 이었는데, 문제 없이 설치된다.
Using pymatlab
from pymatlab.matlab import MatlabSession
import numpy as np
session = MatlabSession()
a = np.arange(10).reshape(2,5)
print a
session.putvalue('a',a)
session.run('b=2.*a')
b = session.getvalue('b')
print b
mscript = '''
d = a
for i=1:10
d = 2*d
end
'''
session.putstring('MSCRIPT',mscript)
session.run('eval(MSCRIPT)')
d = session.getvalue('d')
print d
session.close()
위에서와 같이 수행하면
matlab session이 열어야 하기 때문에 시간이 많이 걸리므로 독립적으로 사용하기보다는
python의
ipython module에서
matlab session과 동시에 사용하는 것이 좀 더 편리하고
pymatlab의 장점을 더 많이 취할 수 있다
.