注意事项:

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路径。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐