Python调用MATLAB函数

0、需求

  • 处理语音数据时需要用到一些MATLAB函数。
  • 而深度学习模型又是Python编写的,又不想将数据保存下来单独打开MATLAB处理,这时就需要在Python代码里调用MATLAB函数。

1、安装MATLAB引擎

  • 首先确定Python版本是否被支持,目前支持的Python版本为:2.7, 3.7, and 3.8(打开链接查看当前支持的版本)。
  • 接着找到matlabroot路径,打开MATLAB在命令行中输入:matlabroot, 此时返回一个路径,记录下此路径。
  • 以Linux系统下的Anaconda为例,Windows同理,注意:这里执行python命令时最好使用完整的python路径,如果有多个解释器就会自动安装到默认的python解释器中, 此步骤需要管理员权限!!!
    cd 上一步保存的matlabroot/extern/engines/python
    sudo /home/zhao/anaconda3/envs/base/bin/python setup.py install
    
  • 安装完成!

2、执行前的注意事项

  • MATLAB对数据类型有严格要求,这里最好都使用matlab.double()将数据类型转换为double。
  • 多维矩阵运算时,首先将数据转换为list类型(ndarray数组.tolist()即可),再用matlab.double()转换数据类型,否则报错无法转化为double类型。
  • 推荐写法:matlab.double(np.array().tolist())

3、调用自带的库函数

  • 首先导入MATLAB模块
    import matlab
    import matlab.engine
    
  • 调用函数
    eng = matlab.engine.start_matlab()
    eng.sqrt(2) # 错误,不接受int64类型的输入
    eng.sqrt(2.) 
    eng.sqrt([2]) # 错误,不接受cell类型的输入
    eng.sqrt([2.])
    eng.sqrt(matlab.double([2]))
    
  • 关闭MATLAB引擎:eng.exit()
  • 其他自带函数同理。

4、执行自定义函数

  • 这里在执行自定义函数时要确保matlab的执行路径与要执行的.m函数文件路径一致,否则会报错matlab.engine.matlabexecutionerror: undefined function xxxx
  • 即首先输入:eng.pwd()来检查当前的Matlab路径是否和自定义的函数文件路径一致。
  • 如果不一致则输入:eng.cd('some path')跳转到相同的路径下。
  • 执行函数: eng.function_name(parameters, nargout=0),这里nargout用来控制返回的参数个数,默认只有一个返回值,而有的函数会有多个返回值。
  • 示例:
    import matlab
    import matlab.engine
    
    eng = matlab.engine.start_matlab()
    eng.pwd() # 检查路径
    eng.cd() # 如果文件路径和当前MATLAB路径不一致就需要先跳转到相同的路径下
    sdr = eng.bss_eval_sources(matlab.double(output.tolist()),matlab.double(y.tolist()))
    eng.exit()
    

5、参考资料

  • Calling MATLAB from Python
  • Get Started with MATLAB Engine API for Python
  • python中调用matlab
  • Python调用matlab函数( 使用matlab官方api,解决多维numpy矩阵输入问题)
  • 如何在Python中调用MATLAB

你可能感兴趣的:(环境配置,python,matlab,linux)