稀疏矩阵的非零元素

时间:2013-07-19 07:18:39

标签: matlab sparse-matrix

假设我有一个带有大量零的大型Matrix X,所以当然我为了节省内存和CPU而使其稀疏。之后我做了一些事情,在某些时候我想拥有非零元素。我的代码看起来像这样:

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

这看起来相当愚蠢,因为稀疏矩阵的结构应该允许直接提取信息。

澄清:我不寻找有效的解决方案,而是希望避免两次做同样的事情。稀疏矩阵应该定义已知的非零值,因此不需要搜索它。

你的magu _

4 个答案:

答案 0 :(得分:2)

从稀疏矩阵中检索非零元素的直接方法是调用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)

答案 1 :(得分:1)

我不是100%肯定你在追求什么,但也许[r c] = find(M)更适合你?

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

答案 2 :(得分:1)

MATLAB推荐

find函数:

  

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

答案 3 :(得分:1)

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

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

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

相关问题