3

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

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

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

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

你的magu_

4

4 回答 4

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)
于 2013-07-19T08:21:31.737 回答
1

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

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

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

于 2013-09-20T17:12:14.580 回答
1

MATLAB 推荐find函数:

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

于 2013-07-19T09:12:14.153 回答
1

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

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

于 2013-07-19T07:57:22.940 回答