【问题标题】:Converting a scipy.sparse matrix into an equivalent MATLAB sparse matrix将 scipy.sparse 矩阵转换为等效的 MATLAB 稀疏矩阵
【发布时间】:2019-11-14 10:20:16
【问题描述】:

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

【问题讨论】:

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


    【解决方案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

    在 Octave 会话中:

    >> 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 兼容的方式处理稀疏矩阵。

    【讨论】:

    • 谢谢!我对 MATLAB 不是很熟悉,因此我认为我没有完全理解并且有一些问题悬而未决。概括地说,你的意思是我应该在 MATLAB 中声明一个未指定的稀疏矩阵,用 hdf5write 将其写入 .mat 文件?您能否详细说明“以该结果为指导”?
    • scipy.io.loadmat/savemat 使用旧版本的 MATLAB .mat 文件。我认为他们可以在两个方向上处理稀疏矩阵。我对其他传输方法不太熟悉。如果您不太了解 MATLAB,这可能是一项无望的任务。
    • 好吧,我看看我能走多远。非常感谢! :-)
    • 好的,我有机会测试通过savematscipy.sparse 矩阵发送到Octave。它有效。
    猜你喜欢
    • 2017-07-02
    • 2023-04-10
    • 2021-11-25
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多