Matlab 和Python结合使用

今天介绍的内容比较基础,希望能达到抛砖引玉的效果。

Matlab 和 Python 结合使用无非分为两种情形:

  • Matlab中使用Python包;
  • Python中使用Matlab。
  • 1. Matlab中使用Python

    MATLAB 支持与包括 Python 在内的多种其他语言互操作, 如 C/C++、Java、Fortran、.NET。

    下面先介绍介绍 如何在 MATLAB 中调用 Python

    首先我们要在自己所用的平台上安装和管理 Python 环境及其依赖项,推荐用Anaconda3,配置好后进行下面的操作。

    现在在 MATLAB 中访问 Python,需要查找 Python 可执行文件的完整路径(比如在Anaconda3中创建了多个虚拟环境,需要将 python.exe 这个东西的路径与Matlab相关联)。

    下面是针对 Windows 的示例。在 Mac 和 Linux 上,操作系统命令可能有所不同。

    clear
    pe = pyenv;
    if pe.Status == "NotLoaded"
        [~,exepath] = system("where python");
        pe = pyenv('Version',exepath);
    

    另外,可以直接用 pyenv 进行手动添加:直接采用字符串形式传递 Python 可执行文件的路径。

    比如,我们在 anaconda3 中除了基本环境 base 之外,还有个 pytorch-gpu的环境,而这个环境一般会在anaconda3安装路径下的 envs 文件夹中,因此通用的路径是:`./anaconda3/envs/pytorch-gpu/python.exe

    pe = pyenv('Version','D:\publicsoftware\anaconda3\envs\pytorch_gpu\python.exe')
    

    值得注意的是,每次新添加环境时,需要重新启动 Matlab !

    在 MATLAB 中设置 Python 之后就可以使用 Python 中的模块或者我们自己写的模块了。

    在命令窗口输入:pyenv 检查关联的 Python 解释器,如下图

    1.png

    在 MATLAB 中调用 Python 时,首先使用 py,后跟包或方法名称,推荐这种用法。如果用 import py.modulename.*命令时,很容易混淆:到底是 Matlab中的包还是Python中的。

    一个例子:

    编写如下模块名为mymodule.py的Python代码

    # !/usr/bin/env python3
    # -*- coding:utf-8 -*-
    class Calculator:
        def __init__(self, a, b):
            self.a = a
            self.b = b
        def add_operator(self):
            return self.a + self.b
    

    然后在Matlab中使用如下命令创建模块的对象

    pycal = py.mymodule.Calculator(10, 8);
    pycal = 
      Python Calculator - 属性:
        a: 10
        <mymodule.Calculator object at 0x00000221DD671BC8>
    

    创建好对象之后进行调用其方法:(可以通过methodsproperties分别查看方法和属性)

    pycal.add_operator()
    ans =
    

    目前,在Matlab中使用Python有一定的局限性,比如每次更新完Python代码之后,需要重新启动Matlab才会执行更新后的代码,否则还是会执行更新前的代码等等。

    2. Python 中使用 Matlab

    目前有两种方法:

    (1)在python中安装Matlab引擎,找到路径 ‘matlabroot/extern/engines/python’,如D:\publicsoftware\MATLAB\R2020b\extern\engines\python,然后 python setup.py install进行安装。

    import matlab.engine
    eng = matlab.engine.start_matlab()
    x = eng.sqrt(float(100))  ## x = eng.sqrt(100.)
    eng.exit()
    

    值得注意的是**,Matlab与Python之间存在着数据类型的转换,如上述代码中,如果使用x = eng.sqrt(100)

    Python 中会报错,因为python中输入的100Int类型的(但在 Matlab 中默认输入数据都是double型),因此这里需要输入float类型的数据与之对应,所以为直接输入100.或者转换一下float(100)

    下面表格说明了两者之间的数据类型转换:

    6.png

    一键打包,最后选择 for_redistribution_files_only文件夹下的内容,cd 进入到该文件夹,进行模块的安装:python setup.py install

    安装成功后,该模块的命名与我们打包时设置的一样,即 myadd。这个模块会安装在 D:\publicsoftware\anaconda3\Lib\site-packages\myadd中,相当于一个第三方模块。

    最后就像使用其他模块一样,进行导入使用了,不过有点区别,看下面 Python 代码:

    import myadd
    myadd = 
    <module 'myadd' from 'D:\\publicsoftware\\anaconda3\\lib\\site-packages\\myadd\\__init__.py'>
    mat_obj = myadd.initializer()
    mat_obj = 
    <matlab_pysdk.runtime.deployablepackage.DeployablePackage object at 0x0000018927DDFD88>
    result = mat_obj.myadd(100, 80)
    result = 
    # close connection
    mat_obj.terminate()