2014-09-08 19 views
5

Ich habe eine Sparse-Matrix im CSR-Sparse-Format in Python und möchte es in MATLAB importieren. MATLAB hat kein CSR-Sparse-Format. Es hat nur ein Sparse-Format für alle Arten von Matrizen. Da die Matrix im dichten Format sehr groß ist, frage ich mich, wie ich sie als MATLAB-Sparse-Matrix importieren könnte.Importieren einer Python-Sparse-Matrix in MATLAB

Antwort

2

Die scipy.io.savemat speichert dünn besetzte Matrizen in einem MATLAB-kompatibles Format:

In [1]: from scipy.io import savemat 
In [2]: from scipy import sparse 
In [3]: M = sparse.csr_matrix(np.arange(12).reshape(3,4)) 
In [4]: savemat('temp', {'M':M}) 

In [8]: x=loadmat('temp.mat') 
In [9]: x 
Out[9]: 
{'M': <3x4 sparse matrix of type '<type 'numpy.int32'>' 
    with 11 stored elements in Compressed Sparse Column format>, 
'__globals__': [], 
'__header__': 'MATLAB 5.0 MAT-file Platform: posix, Created on: Mon Sep 8 09:34:54 2014', 
'__version__': '1.0'} 

In [10]: x['M'].A 
Out[10]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

Beachten Sie, dass savemat es csc umgewandelt. Es sorgt auch transparent für die Indexstartpunktdifferenz.

Und in Octave:

octave:4> load temp.mat 
octave:5> M 
M = 
Compressed Column Sparse (rows = 3, cols = 4, nnz = 11 [92%]) 
    (2, 1) -> 4 
    (3, 1) -> 8 
    (1, 2) -> 1 
    (2, 2) -> 5 
    ... 

octave:8> full(M) 
ans =  
    0 1 2 3 
    4 5 6 7 
    8 9 10 11 
+0

Danke. Dies ist der direkte Ansatz. – user3821329

3

Die Matlab und Scipy Sparse-Matrix-Formate sind kompatibel. Sie müssen die Daten, die Indizes und die Matrixgröße der Matrix in Scipy ermitteln und daraus eine spärliche Matrix in Matlab erstellen. Hier ein Beispiel:

from scipy.sparse import csr_matrix 
from scipy import array 

# create a sparse matrix 
row = array([0,0,1,2,2,2]) 
col = array([0,2,2,0,1,2]) 
data = array([1,2,3,4,5,6]) 

mat = csr_matrix((data,(row,col)), shape=(3,4)) 

# get the data, shape and indices 
(m,n) = mat.shape 
s = mat.data 
i = mat.tocoo().row 
j = mat.indices 

# display the matrix 
print mat 

Welche ausdruckt:

(0, 0)  1 
    (0, 2)  2 
    (1, 2)  3 
    (2, 0)  4 
    (2, 1)  5 
    (2, 2)  6 

die Werte m verwenden, n, s, i und j aus Python eine Matrix in Matlab zu erstellen:

m = 3; 
n = 4; 
s = [1, 2, 3, 4, 5, 6]; 
% Index from 1 in Matlab. 
i = [0, 0, 1, 2, 2, 2] + 1; 
j = [0, 2, 2, 0, 1, 2] + 1; 

S = sparse(i, j, s, m, n, m*n) 

Die gibt die gleiche Matrix, nur indiziert von 1.

(1,1)  1 
    (3,1)  4 
    (3,2)  5 
    (1,3)  2 
    (2,3)  3 
    (3,3)  6 
+0

Dank. Nur eine kleine vorgeschlagene Änderung. Für das letzte (sechste) Argument des Sparse-Befehls könnten wir das Ergebnis der nnz-Methode anstelle von m * n verwenden, um Speicherplatz zu sparen (oder es einfach wegzulassen und 5 Argumente zu übergeben, die den gleichen Effekt haben). – user3821329

Verwandte Themen