2013-02-07 16 views
8

Wenn ich versuche, eine Matlab-Matrix in Python zu lesen, bekomme ich folgende FehlerLesen Matlab Matrix in 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 

Die Dynamical.mat ist eine Datei mit der Matrix

% 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 
... 
+0

Aus welcher Version von Matlab stammt diese * .mat? – tacaswell

+1

Es wird von einem Petsc-Paket ausgegeben und wurde nicht von Matlab generiert. – Hesam

+0

Können Sie "echte" Matlab-Dateien lesen? Kann Matlab deine Datei lesen? Die Verwendung einiger Pakete von Drittanbietern mit Formaten wie Matlab klingt nach Problemen ... – Floris

Antwort

2

diese Frage scheint eine Zeit lang inaktiv zu sein, aber es ist gut, eine Alternative für den Fall, lassen Sie noch brauchen, um diese .mat-Datei zu lesen, ist es immer im Format vorausgesetzt, Sie angegeben:

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 
+0

Dies funktioniert nicht, da die .mat-Datei nicht ascii ist. Sie erhalten den Fehler: String konnte nicht in Float umgewandelt werden – ChuNan

+0

@ChuNan die Antwort übernimmt das vom OP angegebene Format und in diesem Fall funktioniert es. Haben Sie ein Beispiel für eine binäre .mat-Datei? –

+0

Ich generierte eine einfache 3X3-Matrix mit allen doppelten Zahlen. Als ich versuchte, mat.next() .split() zu drucken, zeigte es mir: "MATLAB 5.0 MAT-Datei Platform PCWIN erstellt am ......" und dann etwas wie x00 \ x01IM \ x0f \ x00 ... . – ChuNan