在 Python 中使用 loadmat 加载 .mat 和 .m 文件

use*_*196 7 matlab loading python-3.x

我目前正在学习神经网络课程,我正在尝试.mat使用从 Python加载文件scipy.io.loadmat(filename),但我不断收到以下错误消息:

ValueError:未知的 mat 文件类型,版本 101、58

当我尝试使用 .m 文件加载 .m 文件而不是.mat文件时,出现了相同的消息scipy.io.loadmat()

我不知道如何解决这个问题,所以如果这里有人可以帮助我,我将不胜感激。

Tas*_*nou 7

(将我的评论转换为答案)

一个.m文件是一个 matlab/octave 脚本。您不“加载”脚本。即使在 matlab/octave 中也没有。您只能运行它,这可能会或可能不会导致您可以将其保存到文件中的特定工作区.mat

python 有“matlab 接口”,您可以使用它.m在 python 会话中运行文件,例如官方的MATLAB Engine API for Python,或者如果您有较旧的 matlab 版本,您可以尝试在线查找其他 python matlab 接口(a简单的谷歌搜索给了我pymatlabmlabmlabwrap等)。如果您的 .m 文件与 Octave 兼容(并且您安装了 Octave),您还可以尝试oct2py界面,该界面运行良好。安装这些接口之一后,您可以尝试运行脚本,然后将工作区变量传输到 python,或者使用该接口保存到 .mat 文件,然后scipy.io.loadmat正常使用将其加载回 python。

至于 .mat 文件给你一个错误,最可能的原因是它是 .mat 规范的较新版本,python 尚无法识别(你使用的是哪个 matlab 版本?)。尝试在 matlab(或八度)中加载 .mat 文件并使用 -v7 选项再次保存。然后 Python 应该可以毫无问题地打开它。

编辑:这是一个通过 oct2py 运行八度音程脚本的示例,将生成的八度音程工作空间保存到文件中.mat,并将该.mat文件加载到 python 中。

%% file myscript.m located at /home/tasos/Desktop
a = 1
b = 2
c = 3
Run Code Online (Sandbox Code Playgroud)
# from python:
from oct2py import octave as oct
oct.eval("cd /home/tasos/Desktop")
oct.eval("myscript")
oct.eval("save -v7 myworkspace.mat")

from scipy.io import loadmat
D = loadmat("/home/tasos/Desktop/myworkspace.mat")
print D.keys() 
#>>> ['a', 'c', 'b', '__header__', '__globals__', 'ans', '__version__']
print D['a'], D['b'], D['c']
#>>> [[ 1.]] [[ 2.]] [[ 3.]]
Run Code Online (Sandbox Code Playgroud)