Python 将scipy.sparse矩阵转换为等效的MATLAB稀疏矩阵
我有一个Python 将scipy.sparse矩阵转换为等效的MATLAB稀疏矩阵,python,matlab,scipy,sparse-matrix,data-conversion,Python,Matlab,Scipy,Sparse Matrix,Data Conversion,我有一个scipy.sparse.lil_矩阵,我想将它输入到使用。到目前为止,我看到的帖子要么是关于如何将MATLAB稀疏矩阵转换为python等价物,要么是需要修改MATLAB代码,我宁愿绕开它。在内部,我相信MATLAB使用的是类似于csc的格式。但是构造是(至少在我几年前使用它时)带有coo风格的输入——数据、行、列 我建议在MATLAB中创建一个稀疏矩阵,并将其保存(在HDF5之前的模式下)到.mat中。然后用scipy.io.loadmat加载它。然后在将scipy.sparse矩阵
scipy.sparse.lil_矩阵
,我想将它输入到使用。到目前为止,我看到的帖子要么是关于如何将MATLAB稀疏矩阵转换为python等价物,要么是需要修改MATLAB代码,我宁愿绕开它。在内部,我相信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/loadmat
代码以与MATLAB兼容的方式处理稀疏矩阵。谢谢!我对MATLAB不是很熟悉,因此我认为我不完全理解,还有一些问题有待解决。总而言之,您的意思是我应该在MATLAB中声明一个未指定的稀疏矩阵,用hdf5write将其写入.mat文件?请详细说明“使用该结果作为指导”scipy.io.loadmat/savemat
使用的是旧版本的MATLAB.mat文件。我认为他们可以在两个方向上处理稀疏矩阵。我不太熟悉其他的转移方式。如果你对MATLAB不太了解,这可能是一个没有希望的任务。好吧,我看看我能走多远。非常感谢!:-)好的,我有机会通过savemat
将scipy.sparse
矩阵发送到倍频程。它起作用了。
>> 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