簡體   English   中英

matlab m×n 稀疏矩陣到 python 的轉換

[英]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 與匹配大小。 ab是 (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM