【问题标题】:nonzero elements of sparse Matrix稀疏矩阵的非零元素
【发布时间】:2013-07-19 07:18:38
【问题描述】:

假设我有一个带有很多零的大型 Matrix X,所以我当然将其设为稀疏以节省内存和 CPU。之后我做了一些事情,在某些时候我想要非零元素。我的代码如下所示:

 ind = M ~= 0; % Whereby M is the sparse Matrix

这对我来说看起来很傻,因为稀疏矩阵的结构应该允许直接提取信息。

澄清一下:我不寻找有效的解决方案,而是希望避免重复做同样的事情。稀疏矩阵应该已经知道它的非零值,所以应该不需要搜索它。

你的魔法师_

【问题讨论】:

    标签: matlab sparse-matrix


    【解决方案1】:

    从稀疏矩阵中检索非零元素的直接方法是调用nonzeros()

    直接方式显然是最快方法,但是我对稀疏的逻辑索引及其full()交易对手进行了一些测试,以及对前者的索引更快(结果取决于矩阵的稀疏模式和维度)。

    100 次迭代的总和是:

    nonzeros:   0.02657 seconds
    sparse idx: 0.52946 seconds
    full idx:   2.27051 seconds
    

    测试套件:

    N = 100;
    t = zeros(N,3);
    for ii = 1:N
        s = sprand(10000,1000,0.01);
        r = full(s);
    
        % Direct call nonzeros
        tic
        nonzeros(s);
        t(ii,1) = toc;
    
        % Indexing sparse
        tic
        full(s(s ~= 0));
        t(ii,2) = toc;
    
        % Indexing full
        tic
        r(r~=0);
        t(ii,3) = toc;
    end
    
    sum(t)
    

    【讨论】:

    • full 和 sparse 的代码或 cmets 似乎被切换了。
    • @DennisJaheruddin 他们不是。 r 已经满了,我需要将 s(...) 转换为 full 以获得最终结果,而这一步属于时机。
    • 是的,这实际上正是我正在寻找的东西(我的意思是非零值)。做同样的操作(索引两次)对我来说似乎很愚蠢。谢谢你的答案。
    【解决方案2】:

    我不能 100% 确定你想要什么,但也许 [r c] = find(M) 更适合你?

    您可以通过M(r,c) 获得M 的值,但最好的方法肯定取决于您接下来打算如何处理数据。

    【讨论】:

      【解决方案3】:

      find函数是MATLAB推荐的:

      [row,col] = find(X, ...) 返回矩阵 X 中非零项的行和列索引。这种语法在处理稀疏矩阵时特别有用。

      【讨论】:

      • Find 检索已由稀疏对象存储的子向量。 nonzeros() 直接检索值,无需任何额外的索引。
      【解决方案4】:

      虽然find之前已经提出过,但我认为这是一个重要的补充:

      [r,c,v] = find(M);
      

      不仅为您提供索引 r,c,还为您提供非零值 v。使用 nonzeros 命令似乎要快一些,但 find 是通常在处理稀疏矩阵时非常有用,因为 [r,c,v] 向量描述了完整的矩阵(矩阵维度除外)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多