2013-02-07 75 views
8

當我試圖讀取一個Matlab矩陣爲蟒蛇,我收到以下錯誤閱讀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 
... 
+0

什麼版本的matlab是這個'* .mat'的? – tacaswell

+1

它是Petsc軟件包的輸出,並沒有由Matlab生成 – Hesam

+0

你能讀「真正的」Matlab文件嗎? Matlab可以讀取你的文件嗎?使用一些像Matlab這樣的格式的第三方軟件包聽起來像是在招惹麻煩...... – Floris

回答

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

這將不起作用,因爲.mat文件不是ascii。您將收到錯誤:無法將字符串轉換爲float – ChuNan

+0

@ChuNan答案採用OP指定的格式,在這種情況下,它的工作原理。你有一個二進制.mat文件的例子嗎? –

+0

我生成了所有雙數的簡單3X3矩陣。當我嘗試打印mat.next()。split()時,它顯示我:「MATLAB 5.0 MAT-file Platform PCWIN在......上創建」,然後顯示如x00 \ x01IM \ x0f \ x00 ... 。 – ChuNan