【问题标题】:Converting a sparse matrix into cell array efficiently有效地将稀疏矩阵转换为元胞数组
【发布时间】:2014-03-17 03:45:03
【问题描述】:

我有以下形式的稀疏矩阵

让我们以 5x10 矩阵为例

      1  2  3  4  5  6  7  8  9  10
 1    1  1  0  0  0  0  0  0  0   0
 2    0  1  0  0  0  0  0  0  0   0
 3    .............................
 4    .............................
 5    .............................

从这个稀疏矩阵,我想创建一个单元格数组 C 的形式

C{1} 1
C{2} = [1,2]
...........
...........
...........

我的稀疏矩阵是高维的,例如 40000 x 790000。如何在 matlab 中有效地做到这一点。我绝对可以使用循环并且效率低下。但我想要最有效的。有什么建议吗?

【问题讨论】:

    标签: matlab sparse-matrix


    【解决方案1】:

    使用find 获取索引并使用accumarray 按列分组:

    [ii, jj] = find(A);
    C = accumarray(jj, ii, [], @(v) {v.'});
    

    基准测试

    %// Random sparse matrix. Code adapted from @teng's answer
    sz = [4e4 79e4];
    nz = 1e5; %// number of nonzeros
    A = sparse(randi(sz(1),[nz 1]),randi(sz(2),[nz 1]),1,sz(1),sz(2));
    
    tic;    
    [ii, jj] = find(A);
    C = accumarray(jj, ii, [], @(v) {v.'});
    toc
    

    结果:

    • 对于nz = 1e4

      Elapsed time is 0.099657 seconds.
      
    • 对于nz = 1e5

      Elapsed time is 0.756234 seconds.
      
    • 对于nz = 1e6

      Elapsed time is 5.431427 seconds.
      

    【讨论】:

    • 您的 2-liner 不仅使用更少的内存,而且您的 2-liner 比我的 3-liner 快 15 倍。 :D 很好的解决方案!
    【解决方案2】:

    让我开始派对... 让我们从基础开始:

     tic;
     sz = [ 400 7900]; % hehe...
     aMat = sparse(randi(sz(1),[1000 1]),randi(sz(2),[1000 1]),1,sz(1),sz(2));
     aCell = mat2cell(aMat,ones([sz(1) 1]));
     preC = cellfun(@(x) x(x~=0), aCell,'UniformOutput',false);
     C = cellfun(@(x) find(x), preC,'UniformOutput',false);
     toc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-07
      • 2021-02-01
      • 1970-01-01
      • 2023-04-10
      • 2021-11-25
      • 2017-07-02
      • 2023-04-05
      • 2019-11-14
      相关资源
      最近更新 更多