通过 Python 调用 MATLAB 函数

MATLB安装于/opt/local/MATLAB/R2017a目录

一、Python安装MATLAB引擎

为了不“污染”MATLAB,先建立engines/python的备份(两个分别用于python2,python3)

sudo chmod a+rw /opt/local/MATLAB/R2017a/extern/engines
cp -Rf /opt/local/MATLAB/R2017a/extern/engines/python /opt/local/MATLAB/R2017a/extern/engines/python-27
cp -Rf /opt/local/MATLAB/R2017a/extern/engines/python /opt/local/MATLAB/R2017a/extern/engines/python-35
sudo chmod 755 /opt/local/MATLAB/R2017a/extern/engines

安装:

cd /opt/local/MATLAB/R2017a/extern/engines/python-27
python setup.py build 
sudo python setup.py install

这里安装的是Python2,安装python3如下:

cd /opt/local/MATLAB/R2017a/extern/engines/python-35
python3 setup.py build 
sudo python3 setup.py install

二、验证:

pip list一下发现有下面这个模块了:

matlabengineforpython         R2017a 

三、使用(调用MATLAB内置函数isprime)

~$ python
Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import matlab.engine
>>> eng = matlab.engine.start_matlab()
>>> tf = eng.isprime(37)
>>> print(tf)
True
>>> 

四、MATLAB中调用python函数

MATLAB R2015a 开始支持直接调用 Python:

>> pyversion

       version: '2.7'
    executable: '/usr/bin/python'
       library: 'libpython2.7.so.1.0'
          home: '/usr'
      isloaded: 0

>> py.print('Hello world!')
Hello world!
>> py.sum([0,1,2])

ans =

     3

>> py.print(py.pow(int32(2), int32(1000)))
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
>> 

导入.py文件(用edit命令创建test1.py):

>> edit test1.py
>> py.test1.c1(4,7)

ans =

    11

>> 

其中test1.py的内容如下:

def c1(a1,b1):
	c=a1+b1
	return c

但有时import有些模块会出现libstdc++.so.6版本不对的情况,如py.importlib.import_module('cv2')

/opt/local/MATLAB/R2017a/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found

依赖GLIBCXX_3.4.21,但Matlab自带的那个最高支持到GLIBCXX_3.4.20

$ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25|grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.14
GLIBC_2.4
GLIBC_2.18
GLIBC_2.16
GLIBC_2.3.4
GLIBC_2.17
GLIBC_2.3.2
GLIBCXX_DEBUG_MESSAGE_LENGTH

$ strings /opt/local/MATLAB/R2017a/sys/os/glnxa64/libstdc++.so.6.0.20|grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
.........

解决方法把/opt/local/MATLAB/R2017a/sys/os/glnxa64/libstdc++.so.6链接改过来(比较粗暴的做法,暂时没发现matlab运行有问题)

sudo rm /opt/local/MATLAB/R2017a/sys/os/glnxa64/libstdc++.so.6
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25 /opt/local/MATLAB/R2017a/sys/os/glnxa64/libstdc++.so.6

不行再改回来
sudo rm /opt/local/MATLAB/R2017a/sys/os/glnxa64/libstdc++.so.6
sudo ln -s /opt/local/MATLAB/R2017a/sys/os/glnxa64/libstdc++.so.6.0.20 /opt/local/MATLAB/R2017a/sys/os/glnxa64/libstdc++.so.6

 

转载于:https://my.oschina.net/u/2245781/blog/1823503

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值