MATLAB 与 Python 混合编程实战指南
在科学计算领域,MATLAB 和 Python 就像两把各有所长的'神兵利器'——MATLAB 凭借矩阵运算的'独门绝技'称霸工程仿真,Python 则依靠开源生态的'人海战术'横扫 AI 与数据科学。但在实际研发中,单一语言往往难以覆盖全流程需求:用 MATLAB 做完工程仿真,想对接 Python 的机器学习模型;用 Python 训练好 AI 模型,又需要 MATLAB 做工程验证。
这种场景下,MATLAB 与 Python 的混合编程不再是'锦上添花',而是提升研发效率的'刚需'。本文将手把手教你打通两大语言的壁垒,从技术原理到代码实战,全方位解析跨语言协作的最优路径。
一、核心技术路径对比
在动手编码前,先理清 MATLAB 与 Python 互调的核心方案,不同场景适配不同技术:
| 技术方案 | 适用场景 | 性能 | 部署复杂度 | 核心优势 |
|---|
| MATLAB Engine API | Python 调用 MATLAB 函数(开发阶段) | 高 | 低(需装 MATLAB) | 调用最直接,支持全量 MATLAB 功能 |
| MATLAB Compiler SDK | MATLAB 代码打包部署(生产环境) | 中 | 中(需运行时) | 无需安装 MATLAB,适合分发 |
| 共享数据文件(HDF5/CSV) | 非实时数据交互 | 低 | 极低 | 无语言依赖,兼容性最好 |
| 第三方库(pymatbridge) | 轻量级 Python 调 MATLAB | 中 | 低 | 无需管理员权限 |
二、实战 1:Python 调用 MATLAB(开发阶段首选)
前置条件
- 安装对应版本的 MATLAB(需匹配 Python 版本,建议 Python 3.8-3.11)
- 配置 MATLAB Engine API:
cd "C:\Program Files\MATLAB\R2023a\extern\engines\python"
python setup.py install
核心代码:Python 调用 MATLAB 函数
步骤 1:编写 MATLAB 函数(my_matlab_func.m)
% 功能:矩阵运算 + 简单统计
% 输入:二维矩阵
% 输出:矩阵的逆、均值、标准差
function[mat_inv, mat_mean, mat_std]=my_matlab_func(mat)
% 异常处理:检查输入是否为矩阵
if ~ismatrix(mat)
error('输入必须为矩阵!');
end
% 计算矩阵的逆(伪逆,避免奇异矩阵报错)
mat_inv = pinv(mat);
% 计算全局均值
mat_mean = mean(mat(:));
% 计算全局标准差
mat_std = std(mat(:));
end
步骤 2:Python 调用上述 MATLAB 函数
import matlab.engine
import numpy as np
def call_matlab_from_python():
eng = matlab.engine.start_matlab()
eng.addpath(r'C:\your_matlab_script_path', nargout=0)
np_mat = np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=np.float64)
mat_mat = matlab.double(np_mat.tolist())
try:
mat_inv, mat_mean, mat_std = eng.my_matlab_func(mat_mat, nargout=3)
print("原始矩阵:")
print(np_mat)
print(f"\nMATLAB 计算的矩阵伪逆:")
print(np.array(mat_inv))
print(f"\n矩阵均值:{mat_mean:.2f}")
print(f"矩阵标准差:{mat_std:.2f}")
except Exception as e:
print(f"调用出错:{e}")
finally:
eng.quit()
if __name__ == "__main__":
call_matlab_from_python()
输出结果示例
原始矩阵: [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]]
MATLAB 计算的矩阵伪逆: [[-0.4815 -0.1481 0.1852] [-0.0741 -0.0000 0.0741] [ 0.3333 0.1481 -0.0370]]
矩阵均值:5.00 矩阵标准差:2.58
关键说明
nargout:必须指定返回值数量,否则 MATLAB 默认返回 1 个结果
- 数据类型转换:Python 的
numpy.array 需先转 list 再转 matlab.double
- 资源释放:
eng.quit() 必须执行,否则会残留 MATLAB 进程
三、实战 2:MATLAB 调用 Python(工程验证场景)
前置条件
- MATLAB 中配置 Python 环境:在 MATLAB 命令行执行
% 查看已识别的 Python 版本
pyversion
% 手动指定 Python 路径(如需要)
pyversion('C:\Python39\python.exe')
核心代码:MATLAB 调用 Python 机器学习库
步骤 1:编写 Python 脚本(my_python_func.py)
import numpy as np
from sklearn.linear_model import LinearRegression
def linear_regression_demo(x_data, y_data):
""" 线性回归预测
:param x_data: 自变量(二维数组)
:param y_data: 因变量(一维数组)
:return: 模型系数、截距、预测值
"""
x = np.array(x_data).reshape(-1,1)
y = np.array(y_data)
model = LinearRegression()
model.fit(x, y)
y_pred = model.predict(x)
return model.coef_.tolist(), model.intercept_.tolist(), y_pred.tolist()
步骤 2:MATLAB 调用 Python 脚本
function call_python_from_matlab()
% 1. 配置 Python 路径(添加脚本所在目录)
py.sys.path.append('C:\your_python_script_path');
% 2. 构造测试数据
x_data = [1,2,3,4,5]; % 自变量
y_data = [2.1,3.9,6.2,7.8,10.1]; % 因变量(近似 y=2x)
try
% 3. 调用 Python 函数
% 注意:MATLAB 数组转 Python 列表需用 num2cell+cell2mat,或直接传数组
[coef, intercept, y_pred] = py.my_python_func.linear_regression_demo(x_data, y_data);
% 4. 结果转换与输出(Python 类型转 MATLAB 类型)
% Python 列表转 MATLAB 数组
coef_mat = cell2mat(py.list(coef));
intercept_mat = double(intercept);
y_pred_mat = cell2mat(py.list(y_pred));
disp('线性回归模型系数:');
disp(coef_mat);
disp(['截距:',num2str(intercept_mat)]);
disp('预测值:');
disp(y_pred_mat);
% 5. 可视化(MATLAB 优势)
plot(x_data, y_data,'o','DisplayName','原始数据');
hold on;
plot(x_data, y_pred_mat,'-r','DisplayName','拟合曲线');
xlabel('X');
ylabel('Y');
title('MATLAB 调用 Python sklearn 线性回归');
legend;
grid on;
catch ME
disp(['调用出错:', ME.message]);
end
end
% 执行函数
call_python_from_matlab();
输出结果示例
线性回归模型系数: 2.0020
截距:0.0800
预测值: 2.0820 4.0840 6.0860 8.0880 10.0900
同时会弹出 MATLAB 绘图窗口,显示原始数据点和 Python 拟合的回归曲线。
四、生产环境部署方案(无需安装 MATLAB)
开发阶段用 MATLAB Engine 很方便,但生产环境部署时,对方往往没有 MATLAB 授权,此时推荐MATLAB Compiler SDK:
核心步骤
- 在 MATLAB 中用
deploytool 打包函数为 Python 包
- 生成的包可在仅安装 MATLAB Runtime 的机器上运行
- Python 调用打包后的 MATLAB 函数(无需 MATLAB)
pip install your_matlab_package.whl
五、避坑指南
- 版本兼容:MATLAB R2022b+ 建议搭配 Python 3.8-3.11,版本不匹配会导致 engine 安装失败
- 数据类型:跨语言传递时优先用基础类型(double/int/string),避免复杂对象
- 异常处理:两边都要加 try-catch,MATLAB 的 error 会直接抛到 Python 中
- 性能优化:避免频繁调用跨语言函数(一次传递批量数据),减少数据转换开销
总结
- Python 调 MATLAB:开发阶段用 MATLAB Engine API,直接高效;生产环境用 Compiler SDK 打包,无需 MATLAB 授权。
- MATLAB 调 Python:适合复用 Python 的 AI/机器学习库,重点做好数据类型转换和异常捕获。
- 混合编程核心价值:让 MATLAB 的工程仿真能力与 Python 的 AI 生态深度融合,覆盖'算法开发 - 模型训练 - 工程验证'全流程,大幅提升研发效率。
无论是科研院所的算法验证,还是企业的工程化落地,MATLAB 与 Python 的混合编程都能打破语言壁垒,让技术栈的优势最大化。希望本文的实战代码能帮你快速上手,少走弯路!