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
MATLAB
cevap
scipy.io.savemat
bir MATLAB uyumlu bir biçimde seyrek matrisler kaydeder: savemat
csc
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
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
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
- 1. MATLAB
- 2. MATLAB
- 3. MATLAB
- 4. Matlab
- 5. Matlab
- 6. MATLAB
- 7. MATLAB
- 8. MATLAB
- 9. MATLAB
- 10. (Matlab
- 11. MATLAB
- 12. MATLAB
- 13. MATLAB
- 14. MATLAB
- 15. MATLAB
- 16. MATLAB
- 17. MATLAB
- 18. matlab
- 19. MATLAB
- 20. MATLAB
- 21. MATLAB
- 22. MATLAB
- 23. Matlab
- 24. matlab
- 25. Matlab
- 26. Matlab
- 27. MATLAB
- 28. MATLAB
- 29. Matlab
- 30. MATLAB
Teşekkürler. Bu doğrudan bir yaklaşımdır. – user3821329