2013-02-07 42 views
8

Khi tôi đang cố gắng để đọc một ma trận Matlab vào python, tôi nhận được lỗi sauđọc Matlab ma trận vào 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 

Các Dynamical.mat là một file chứa các ma trận

% 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

Phiên bản MATLAB nào là '* .mat' này? – tacaswell

+1

Đây là đầu ra từ gói Petsc và chưa được tạo bởi Matlab – Hesam

+0

Bạn có thể đọc các tệp Matlab "thực" không? Matlab có thể đọc tệp của bạn không? Sử dụng một số gói của bên thứ ba với các định dạng như âm thanh của Matlab như yêu cầu sự cố ... – Floris

Trả lời

2

Câu hỏi này dường như không hoạt động trong một thời gian, nhưng bạn nên để một lựa chọn thay thế trong trường hợp bạn vẫn cần đọc tệp này .mat, giả sử nó luôn ở định dạng bạn đã chỉ định:

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

Điều này sẽ không hoạt động vì tệp .mat không phải là ascii. Bạn sẽ nhận được lỗi: không thể chuyển đổi chuỗi thành float – ChuNan

+0

@ChuNan câu trả lời giả định định dạng được chỉ định bởi OP và trong trường hợp này nó hoạt động. Bạn có ví dụ về tệp nhị phân .mat không? –

+0

Tôi đã tạo một ma trận 3X3 đơn giản với tất cả các số kép. Khi tôi cố gắng để in mat.next(). Split(), nó cho tôi thấy: "MATLAB 5.0 MAT-tập tin nền tảng PCWIN tạo ra trên ......" và sau đó một cái gì đó như x00 \ x01IM \ x0f \ x00 ... . – ChuNan

Các vấn đề liên quan