MATLAB R2023a导出.mat文件在Python中读取异常的问题求助
问题:MATLAB导出的Simulink信号日志在Python中读取异常
我在MATLAB R2023a中用以下命令导出Simulink信号日志:
save logs.mat logsout -v7
参考多个技术线程的建议,选择了-v7版本以方便Python读取。但用Python的scipy.io.loadmat读取后:
from scipy.io import loadmat # this is the SciPy module that loads mat-files mat = loadmat('logs.mat')
得到的不是MATLAB里的结构化数据集,而是一个形状为(1, 277355408)的数组。请问问题出在哪?我需要在Python中处理这些信号。
解答
核心原因:
logsout是Simulink专用的Simulink.SimulationData.Dataset对象,scipy无法解析
Simulink的日志对象并非普通MATLAB结构体,scipy.io.loadmat对这类专用对象的支持有限,会将其识别为原始字节流,因此返回超大的一维数组。解决方法1:在MATLAB中先转换为普通结构体再保存
将Dataset对象转换为MATLAB原生结构体后再导出,scipy就能正常解析:logs_struct = struct(logsout); save logs_struct.mat logs_struct -v7用Python读取后,
mat['logs_struct']会呈现嵌套字典结构,对应MATLAB结构体的字段,可直接提取信号数据。解决方法2:直接导出为HDF5格式(更推荐)
利用Dataset对象的export方法导出为HDF5格式,Python中用h5py读取更高效:export(logsout, 'FileName', 'logs.h5', 'FileFormat', 'HDF5');Python读取代码:
import h5py with h5py.File('logs.h5', 'r') as f: # 查看所有信号名称 print(list(f.keys())) # 读取指定信号数据 signal_data = f['你的信号名称'][:]解决方法3:用MATLAB Engine for Python直接读取
安装MATLAB Engine后,直接在Python中调用MATLAB处理logsout:import matlab.engine eng = matlab.engine.start_matlab() mat_data = eng.load('logs.mat', 'logsout') logs_struct = eng.struct(mat_data['logsout']) # 转换为Python可处理的字典结构 logs_dict = eng.cell2mat(logs_struct)
内容的提问来源于stack exchange,提问作者Ruli
相关产品推荐
相关产品推荐

