将scipy.sparse矩阵转换为等效的MATLAB稀疏矩阵

时间:2019-07-03 17:04:37

标签: python matlab scipy sparse-matrix data-conversion

我有一个scipy.sparse.lil_matrix,我想使用MATLAB Engine API for Python输入到MATLAB方法(不是我写的)中。到目前为止,我所看到的帖子要么是关于如何将MATLAB稀疏矩阵转换为等效的python,要么是需要修改我宁愿规避的matlab代码。

1 个答案:

答案 0 :(得分:1)

在内部,我相信MATLAB使用csc格式。但是,构造(至少在几年前使用时)具有coo样式输入-数据,行和列。

我建议在MATLAB中创建一个稀疏矩阵,并将其保存(在HDF5之前的模式下)到.mat中。然后用scipy.io.loadmat加载。然后,在将scipy.sparse矩阵写回到.mat时,以该结果为指导。

scipy.sparse有一个save函数,但是它使用np.savez来写入各自的属性数组。如果您拥有可以处理.npy文件的MATLAB代码,则可能可以加载这样的保存(再次使用coo格式)。

===

测试。

创建并保存稀疏矩阵:

In [263]: from scipy import io, sparse                                                                          
In [264]: M = sparse.random(10,10,.2,'coo')                                                                     
In [265]: io.savemat('sparse.mat', {'M':M})       

在Python端测试负载:

In [268]: io.loadmat('sparse.mat')                                                                              
Out[268]: 
{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Wed Jul  3 11:41:23 2019',
 '__version__': '1.0',
 '__globals__': [],
 'M': <10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 20 stored elements in Compressed Sparse Column format>}

因此savemat在保存之前将coo格式转换为csc

在八度会话中:

>> load sparse.mat
>> M
M =

Compressed Column Sparse (rows = 10, cols = 10, nnz = 20 [20%])

  (4, 1) ->  0.41855
  (6, 1) ->  0.33456
  (7, 1) ->  0.47791
  (4, 3) ->  0.27464
  (2, 4) ->  0.96700
  (3, 4) ->  0.60283
  (10, 4) ->  0.41400
  (1, 5) ->  0.57004
  (2, 5) ->  0.44211
  (1, 6) ->  0.63884
  (3, 7) ->  0.012127
  (8, 7) ->  0.77328
  (8, 8) ->  0.25287
  (10, 8) ->  0.46280
  (1, 9) ->  0.0022617
  (6, 9) ->  0.70874
  (1, 10) ->  0.79101
  (3, 10) ->  0.81999
  (6, 10) ->  0.12515
  (9, 10) ->  0.60660

因此,看起来savemat/loadmat代码以MATLAB兼容的方式处理稀疏矩阵。