简介:本文详细介绍Python调用MATLAB的三种主流方法,包含MATLAB Engine API、MAT文件交互和MATLAB Compiler SDK的完整操作指南,提供可运行的代码示例和性能优化建议,助力科研与工程领域实现跨语言高效协作。
在工程计算与数据分析领域,MATLAB以其强大的数学运算能力和专业工具箱占据重要地位,而Python凭借丰富的生态系统和易用性成为数据科学的主流语言。当项目需要同时利用两者的优势时,跨语言调用成为关键需求。典型场景包括:
pip install matlab.engine自动关联
import matlab.engineeng = matlab.engine.start_matlab()print(eng.sqrt(4.0)) # 输出2.0eng.quit()
数值计算:
import matlab.engineeng = matlab.engine.start_matlab()result = eng.eval('magic(3)') # 调用MATLAB函数print(result)
数据传递优化:
import numpy as nparr = np.array([[1,2],[3,4]])mat_arr = matlab.double(arr.tolist()) # 转换为MATLAB数组eng.svd(mat_arr) # 调用奇异值分解
异步调用:
future = eng.run_async('long_running_script')# 继续执行Python代码...result = future.result() # 获取结果
matlab.double替代Python列表转换@matlab.engine.matlabfunction装饰器
import scipy.io as sio# 写入MAT文件data = {'array': np.array([1,2,3]), 'matrix': np.random.rand(3,3)}sio.savemat('data.mat', data)# 读取MAT文件loaded = sio.loadmat('data.mat')print(loaded['array'])
结构体处理:
# 创建嵌套结构struct = {'field1': {'subfield': np.arange(5)}}sio.savemat('struct.mat', {'data': struct})
稀疏矩阵:
from scipy.sparse import csr_matrixsparse_mat = csr_matrix(([1,2,3], ([0,1,2], [1,2,3])), shape=(4,4))sio.savemat('sparse.mat', {'sparse': sparse_mat})
创建addNumbers.m:
function y = addNumbers(a,b)y = a + b;end
使用libraryCompiler打包:
% MATLAB命令行libraryCompiler% 选择Python Package类型% 指定输出目录和函数名
安装生成的Python包:
pip install ./addNumbers_pkg/dist/addNumbers-1.0-py3.8.egg
调用示例:
import addNumbersadd_obj = addNumbers.initialize()result = add_obj.addNumbers(3, 5)print(result) # 输出8terminate(add_obj)
import matlab.engineimport numpy as np# 启动MATLAB引擎eng = matlab.engine.start_matlab()# 生成测试信号fs = 1000t = np.arange(0, 1, 1/fs)signal = np.sin(2*np.pi*50*t) + 0.5*np.random.randn(len(t))# 转换为MATLAB格式mat_signal = matlab.double(signal.tolist())# 调用MATLAB滤波器设计eng.filter_design(nargout=0) # 假设有预存的filter_design.mfiltered = eng.filter(eng.designfilt('lowpassiir',...), mat_signal)# 可视化对比import matplotlib.pyplot as pltplt.plot(t, signal, label='Original')plt.plot(t, np.array(filtered._data).flatten(), label='Filtered')plt.legend()plt.show()eng.quit()
import scipy.io as sioimport numpy as npfrom tensorflow.keras.models import load_model# 从MATLAB导出预处理参数preproc_params = sio.loadmat('preproc.mat')mean = preproc_params['mean'][0]std = preproc_params['std'][0]# 加载Python模型model = load_model('model.h5')# 创建预处理函数def preprocess(image):image = (image - mean) / stdreturn image# 实际应用示例test_image = np.random.rand(224,224,3) * 255processed = preprocess(test_image)prediction = model.predict(np.expand_dims(processed, axis=0))
ImportError: undefined symbolconda create -n matlab_env python=3.8创建隔离环境
import matlab.enginetry:eng = matlab.engine.start_matlab()eng.nonexistent_function()except matlab.engine.MatlabExecutionError as e:print(f"MATLAB错误: {e.message}")finally:if 'eng' in locals():eng.quit()
混合编程原则:
调试技巧:
eng.eval('whos')检查MATLAB工作区部署方案:
通过系统掌握这三种调用方式及其适用场景,开发者可以灵活构建高效的跨语言计算管道。实际项目中,建议根据计算复杂度、数据规模和团队技能进行技术选型,典型项目可节省30%-60%的代码重构时间。