注意事项:
1.安装Matlab建议使用图形化界面,比较方便,因此最好先安装好GNOME等图形化见面的软件,可以参考这里,如果没有图形化界面就开始安装matlab,执行./install
会报以下错误:
terminate called after throwing an instance of '(anonymous namespace)::DisplayError'
what(): No display available.
Aborted
2.需要vncwiewer等。如果是使用云服务器(比如我使用的腾讯云),可以使用VNC登录登录图形化界面,进而启动Matlab的安装程序。如果用普通的Xhell等工具startx
登录,由于只有命令行界面,会卡在这里:
(II) modeset(0): Initializing kms color map for depth 16, 6 bpc.
3.建议硬盘剩余容量在40G以上,因为iso文件就已经占了17G,如果需要安装完整版的MATLAB,那么还至少需要26G,即使是部分安装也会占到18G,所以建议硬盘容量达到40G以上。我上传完iso之后容量不太够,花了6块钱扩了20G。可以使用$ df -h
查看硬盘占用情况。
4.注意matlabengine和python版本的对应关系,这里装的2020a可以和python3.7对应上,其他的请查找一下版本对不对的上。
1 下载Matlab2020a安装包并上传
参考这里
MATLAB_R2020a版本的文件链接如下,包括LInux/Win/Mac三个版本。
链接:https://pan.baidu.com/s/1lhxAH_1dwD6176c5zgwrtA
提取码:17sw
下载完后上传到/usr/local/中
2 挂载
关于挂载的介绍,以下来自《鸟叔的LINUX私房菜》:
①所谓的“挂载”就是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下;也就是说进入该目录就可以读取该分区的意思。
②每个文件系统都有独立的inode、区块、超级区块等信息,这个文件系统要能够连接到目录树才能被我们使用。将文件系统与目录树结合的操作我们称为【挂载】。挂载点一定是目录,该目录为进入该文件系统的入口。挂载需要注意:
- 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
- 单一目录不应该重复挂载多个文件系统;
- 要作为挂载点的目录,理论上应该都是空目录才行(会隐藏掉目录里的原有内容,只有该挂载被卸载之后才会显示原有内容);
由于我们在服务器使用的是Matlab的镜像文件,可以通过loop挂载,这样可以不刻录镜像文件直接挂载使用。我将iso文件上传到了/usr/local/
目录下面,有两种挂载方式如下:
挂载方式一(通过设备名.iso挂载):
先进入/usr/local目录
$ ll -h Matlab98R2020a_Lin64.iso
-rw-r--r-- 1 root root 18G Jul 15 22:09 Matlab98R2020a_Lin64.iso
$ mkdir Matlab2020a
$ mount -o loop ./Matlab98R2020a_Lin64.iso ./Matlab2020a
mount: /usr/local/Matlab98R2020a_Lin64.iso is already mounted #挂载成功
$ df ./Matlab2020a
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/loop0 18530172 18530172 0 100% /usr/local/Matlab2020a #因为是镜像,所以使用率100%
挂载方式二(通过UUID识别文件系统挂载):
先进入/usr/local目录
$ blkid ./Matlab98R2020a_Lin64.iso
./Matlab98R2020a_Lin64.iso: UUID="2020-02-26-12-26-23-00" LABEL="MATHWORKS_R2020A" TYPE="iso9660" #UUID是独一无二的,更可靠
$ mkdir Matlab2020a
$ mount -o loop UUID="2020-02-26-12-26-23-00" ./Matlab2020a
mount: /usr/local/Matlab98R2020a_Lin64.iso is already mounted #挂载成功
$ df ./Matlab2020a
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/loop0 18530172 18530172 0 100% /usr/local/Matlab2020a #因为是镜像,所以使用率100%
另外,取消挂载为:
$ umount /usr/local/Matlab2020a/
重启后,需要重新挂载。
3 安装
从这里开始就得使用图形化界面:
找到文件夹之后,Open in Terminal
$ sudo ./install
选择AnvancedOptions,填入Installation Key,参考这里
安装且激活完之后
开始安装Matlab engine for python
$ cd /usr/local/Polyspace/R2020a/extern/engines/python/
$ ls
dist setup.py
$ python /usr/local/Polyspace/R2020a/extern/engines/python/setup.py install
$ pip freeze # 列出pip安装列表,可以找到engine
测试能否成功import engine,接下来进行两种测试,一种是python直接import测试,另一种是通过c++方式调用的测试。
python测试
$ python
Python 3.7.10 (default, Jul 6 2021, 20:56:47)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matlab
>>> from matlab import engine
>>> print(engine)
<module 'matlab.engine' from '/opt/py37/lib/python3.7/site-packages/matlab/engine/__init__.py'>
>>> matlab.engine.start_matlab()
<matlab.engine.matlabengine.MatlabEngine object at 0x7f51a76ecf90>
该环境下的python中已经可以启动matlab engine。如果不需要通过c++调用python模块,那么到这里就可以成功使用matlab的engine了。
c++方式调用
在项目环境下启动Django加载engine时,却出现错误。
结合两个测试,可以知道python直接调用的时候没有问题,但是通过c++来调用python的模块就出现问题了,于是解决GLIBCXX_3.4.21的问题
根据错误地址
# 看看是否存在so文件
$ ldd /usr/local/Polyspace/R2020a/extern/engines/python/dist/matlab/engine/glnxa64/matlabengineforpython3_7.so | grep libstdc++
libstdc++.so.6 => /usr/local/Polyspace/R2020a/extern/engines/python/dist/matlab/engine/glnxa64/../../../../../../../sys/os/glnxa64/libstdc++.so.6 (0x00007fdcc441c000)
# 确认版本是否为3.4.21
$ grep GLIBCXX_3.4.21 /usr/local/Polyspace/R2020a/extern/engines/python/dist/matlab/engine/glnxa64/matlabengineforpython3_7.so
Binary file /usr/local/Polyspace/R2020a/extern/engines/python/dist/matlab/engine/glnxa64/matlabengineforpython3_7.so matches
# 看lib64中是否有3.4.21
strings /lib64/libstdc++.so.6 | grep GLIBCXX
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_DEBUG_MESSAGE_LENGTH
#复制so文件到lib64文件夹下
$ cp /usr/local/Polyspace/R2020a/extern/engines/python/dist/matlab/engine/glnxa64/../../../../../../../sys/os/glnxa64/libstdc++.so.6 /lib64/
#再次查看lib64是否有3.4.21
$ strings /lib64/libstdc++.so.6 | grep GLIBCXX
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_DEBUG_MESSAGE_LENGTH
此时再次通过Django来调用engine已经成功。
可能出现的错误
在python中调用matlab的函数或者运行m文件的时候,可能会出现类似下面的错误
matlab.engine.MatlabExecutionError: Undefined function 'run' for input arguments of type 'char'.
这时需要在图形化界面下找到matlab目录下的bin输入./matlab
打开matlab,将整个项目加入到matlab的路径中。
也可以在python里面调用matlabengine的时候把项目添加到matlab路径。