MATLAB

2014-09-08 37 views
5

içine bir python seyrek matrisi içe aktarma Python'da CSR Seyrek formatında seyrek bir matrisim var ve bunu MATLAB'a aktarmak istiyorum. MATLAB bir CSR Seyrek formatına sahip değildir. Her türlü matris için sadece 1 Sparse formatı vardır. Matris yoğun formatta çok büyük olduğu için bunu MATLAB seyrek matrisi olarak nasıl ithal edebilirim diye merak ediyordum?MATLAB

cevap

2

scipy.io.savemat bir MATLAB uyumlu bir biçimde seyrek matrisler kaydeder: savematcsc onu dönüştürülür

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

Not söyledi. Ayrıca, dizin başlangıç ​​noktası farkını şeffaf olarak ele alır.

Ve Octave yılında

:

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

Teşekkürler. Bu doğrudan bir yaklaşımdır. – user3821329

3

Matlab ve Scipy seyrek matris biçimleri uyumludur. Scipy'de matrisin verilerini, indekslerini ve matris boyutunu almalı ve Matlab'da bir seyrek matris oluşturmak için kullanmalısınız. i ve Python gelen j Matlab'da bir matris oluşturmak için,

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

değerleri m kullanın, n, s:

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 

yazdırır: İşte bir örnek

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) 

Aynı Matrix'i verir, yalnızca 1'den indekslendi.

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

teşekkürler. Sadece küçük bir değişiklik önerdi. seyrek komutun son (altıncı) argümanı için, yerden tasarruf etmek için mn yerine nnz yönteminin sonucunu kullanabiliriz (ya da basitçe atlayıp, aynı etkiye sahip 5 argümanı geçebiliriz). – user3821329