2014-09-08 30 views
5

Ho una matrice Sparse in formato CSR Sparse in python e voglio importarla in MATLAB. MATLAB non ha un formato Spar CSR. Ha solo 1 formato Sparso per tutti i tipi di matrici. Dato che la matrice è molto grande nel formato denso mi chiedevo come potrei importarla come matrice sparse MATLAB?importazione di una matrice sparsa python in MATLAB

risposta

2

Il scipy.io.savemat salva matrici sparse in un formato compatibile con MATLAB:

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]]) 

Nota che savemat convertito a csc. Inoltre, si occupa in modo trasparente della differenza del punto di partenza dell'indice.

E 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

Grazie. Questo è l'approccio diretto. – user3821329

3

I formati di matrice sparsa sono compatibili con i formati a matrice sparsa Matlab e Scipy. È necessario ottenere i dati, gli indici e le dimensioni della matrice della matrice in Scipy e utilizzarli per creare una matrice sparsa in Matlab. Ecco un esempio:

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 

che stampa:

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

utilizzare i valori m, n, s, i, e j da Python per creare una matrice in Matlab:

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) 

Che fornisce la stessa matrice, indicizzata solo da 1.

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

Grazie. Solo una piccola modifica suggerita. per l'ultimo (sesto) argomento del comando sparse, potremmo usare il risultato del metodo nnz invece di m * n per risparmiare spazio (o semplicemente ometterlo e passare 5 argomenti che avrebbero lo stesso effetto). – user3821329

Problemi correlati