将Matlab矩阵读入Python

8

我尝试将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? - tacaswell
1
这是Petsc软件包的输出,不是由Matlab生成的。 - Roy
2
如果Matlab确实可以读取这些文件,那么编写一个便捷的脚本来启动Matlab、打开并重新保存.mat文件似乎是必须的。 - Thomas
1
还要看一下 h5py*.mat 文件实际上只是具有非常特定布局的 hdf 文件。 - tacaswell
2
我刚刚发现Matlab也无法读取该文件。 - Roy
显示剩余3条评论
1个回答

2

这个问题似乎有一段时间没有活动了,但如果您仍然需要读取这个.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格式的。你会收到错误提示:无法将字符串转换为浮点数。 - ChuNan
@ChuNan,该答案假设符合OP指定的格式,在这种情况下它是有效的。你有一个二进制.mat文件的例子吗? - Saullo G. P. Castro
我生成了一个简单的3X3矩阵,其中包含所有双精度数字。当我尝试打印mat.next().split()时,它显示:"MATLAB 5.0 MAT-file Platform PCWIN created on......",然后类似于x00\x01IM\x0f\x00.... - ChuNan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接