You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:10:09