[英]Conversion of matlab sparse matrix of dimension m by n to python
我正在嘗試將以下 matlab 代碼轉換為 python:
W2 = sparse(1:m*n-1,2:m*n,-w_alpha(1),m*n,3*m*n);
output 在 matlab 中應采用以下格式:
(1,2) -10
(2,3) -10
(3,4) -10
(4,5) -10
..............
...............
這是我在 python 中的代碼:
i=np.int64(np.dot(m,n)-1) #------>m*n-1----->i=102
test_j=np.int64(np.dot(m,n))#------->m*n
j=np.int64(np.dot(3,test_j)) #------>3*m*n----> j=309
a=((np.arange(0,i)).reshape(1,-1))
b=(np.arange(1,test_j)).reshape(1,-1)
W2=csr_matrix((-w_alpha,(a,b)),shape=(test_j,j))
在哪里
m=103
n=1
weights = [10,10,10]
w_alpha = np.float64(weights[0]);
但是,語法不正確。 我使用了 scipy 庫中的以下語法: csr_matrix((data, (row_ind, col_ind)), [shape=(M, N)]) 其中 data、row_ind 和 col_ind 滿足關系 a[row_ind[k], col_ind[k ]] = 數據[k]。
此外,我收到以下錯誤消息:TypeError: len() of unsized object
獲得與 matlab 類似的 output 的任何建議。
好吧,我想這就是你所追求的。 基本問題是,在您傳遞-w_alpha
的地方,您需要傳遞一個包含 N 個-w_alpha
副本的數組。
import numpy as np
from scipy.sparse import csr_matrix
m=103
n=1
weights = [10,10,10]
w_alpha = float(weights[0])
i = m*n-1
test_j = m*n
j = 3*test_j
a = np.arange(0,i).flatten()
b = np.arange(1,test_j).flatten()
w_alpha = np.array([w_alpha] * len(a))
W2 = csr_matrix((-w_alpha,(a,b)),shape=(test_j,j))
print(W2)
Output:
(0, 1) -10.0
(1, 2) -10.0
(2, 3) -10.0
(3, 4) -10.0
(4, 5) -10.0
(5, 6) -10.0
(6, 7) -10.0
(7, 8) -10.0
(8, 9) -10.0
(9, 10) -10.0
(10, 11) -10.0
(11, 12) -10.0
(12, 13) -10.0
(13, 14) -10.0
(14, 15) -10.0
(15, 16) -10.0
(16, 17) -10.0
(17, 18) -10.0
(18, 19) -10.0
(19, 20) -10.0
(20, 21) -10.0
(21, 22) -10.0
(22, 23) -10.0
(23, 24) -10.0
(24, 25) -10.0
: :
(77, 78) -10.0
(78, 79) -10.0
(79, 80) -10.0
(80, 81) -10.0
(81, 82) -10.0
(82, 83) -10.0
(83, 84) -10.0
(84, 85) -10.0
(85, 86) -10.0
(86, 87) -10.0
(87, 88) -10.0
(88, 89) -10.0
(89, 90) -10.0
(90, 91) -10.0
(91, 92) -10.0
(92, 93) -10.0
(93, 94) -10.0
(94, 95) -10.0
(95, 96) -10.0
(96, 97) -10.0
(97, 98) -10.0
(98, 99) -10.0
(99, 100) -10.0
(100, 101) -10.0
(101, 102) -10.0
在 Octave 中,使用w_alpha=10
時,顯示實際上是:
W2 =
Compressed Column Sparse (rows = 25, cols = 75, nnz = 24 [1.3%])
(1, 2) -> -10
(2, 3) -> -10
(3, 4) -> -10
(4, 5) -> -10
(5, 6) -> -10
(6, 7) -> -10
(7, 8) -> -10
(8, 9) -> -10
(9, 10) -> -10
...
所以你可能想改用sparse.csc_matrix
。 而且 arguments 必須是 1d arrays 與匹配大小。 你a
和b
是 (1,102)。 在 MATLAB 中,一切都是 2d,在numpy
中,東西可以是 1d,在某些情況下必須是。
w_alpha = a*0+w_alpha
In [170]: a,b = a.ravel(), b.ravel()
In [171]: w_alpha= w_alpha.ravel()
In [172]: w_alpha = a*0+w_alpha
...: W2=csr_matrix((-w_alpha,(a,b)),shape=(test_j,j))
In [173]: W2
Out[173]:
<103x309 sparse matrix of type '<class 'numpy.float64'>'
with 102 stored elements in Compressed Sparse Row format>
In [174]: print(W2)
(0, 1) -10.0
(1, 2) -10.0
(2, 3) -10.0
如果將 MATLAB 矩陣保存到文件(舊樣式)中, scipy.io.loadmat
可以將其加載為csc
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.