【问题标题】:Read Matlab matrix into Python将 Matlab 矩阵读入 Python
【发布时间】:2013-01-22 11:14:24
【问题描述】:

当我尝试将 Matlab 矩阵读入 python 时,出现以下错误

>>> scipy.io.loadmat("Dynamical.mat")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/scipy/io/matlab/mio.py", line 151, in loadmat
    MR = mat_reader_factory(file_name, appendmat, **kwargs)
  File "/usr/lib/python2.7/dist-packages/scipy/io/matlab/mio.py", line 105, in mat_reader_factory
    mjv, mnv = get_matfile_version(byte_stream)
  File "/usr/lib/python2.7/dist-packages/scipy/io/matlab/miobase.py", line 221, in get_matfile_version
    % ret)
ValueError: Unknown mat file type, version 46, 48

Dynamical.mat 是一个包含矩阵的文件

% Size = 30 30 
% Nonzeros = 252 
zzz = zeros(252,3);
zzz = [
1 1  1.4019896354966477e+01
1 2  0.0000000000000000e+00
1 3  0.0000000000000000e+00
...

【问题讨论】:

  • 这个'*.mat'来自哪个版本的matlab?
  • 是Petsc包的输出,不是Matlab生成的
  • 如果 Matlab 确实可以读取这些文件,那么启动 Matlab 并打开并重新保存 .mat 文件的便捷脚本听起来很正常。
  • 还可以查看h5py*.mat 文件实际上只是具有非常特殊布局的 hdf 文件。
  • 我刚发现Matlab也无法读取文件

标签: python matlab python-2.7 scipy


【解决方案1】:

这个问题似乎是无效的一段时间,但是在仍然需要阅读这个.mat文件的情况下,让一个替代方案是好的,假设它始终是指定的格式:

def read_mat( file_path ):
    import numpy as np
    mat = open(file_path, 'r')
    mat.next() # % Size = 30 30
    length = int(mat.next().split()[-1])
    mat.next() # zzz = zeros(18,3)
    mat.next() # zzz = [
    ans = np.array([ map(float, mat.next().split()) for i in xrange(length) ])
    mat.close()
    return ans

【讨论】:

  • 这不起作用,因为.mat文件不是ascii。您将收到错误:无法将字符串转换为float span>
  • @ chunan答案假设操作op指定的格式,在这种情况下它可以工作。你有一个二进制文件.mat文件吗? span>
  • 我生成了一个简单的3x3矩阵,具有所有双数。当我试图打印mat.next()。拆分(),它显示我:“Matlab 5.0 Mat-File Platform PCWin创建......然后是X00 \ x01im \ x0f \ x00 ... 。 span>
猜你喜欢
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多