繁体   English   中英

Matlab索引稀疏矩阵

[英]Matlab Indexing Sparse Matrix

假设我们有这3个向量定义的以下稀疏矩阵:

[lines, columns, values] = find(A)

lines =

     1
     2
     3
     5
     1
     3
     3
     5
     4
     5


columns =

     1
     2
     2
     2
     3
     3
     4
     4
     5
     5


values =

     3
     4
     7
     3
     1
     5
     9
     6
     2
     5

我想要实现的是访问位置(2,2)的元素

我知道你可以做values(lines == 2)values(columns == 2) ),这将返回第二行(列)的所有值。

我的问题是你如何做一些像values(lines == 2 && columns == 2)来获得A(2,2)的值?

如果要访问稀疏矩阵中的元素或任何其他矩阵。 这没有任何开销。 如果有人能证明我错了,我非常希望看到它的基准,因为那时我错过了一些非常重要的东西!

a = Q(2,2);

如果要将元素添加到稀疏矩阵,这也非常简单。 我认为没有更快的方法可以做到这一点。 再次,如果有人可以证明我错了,请分享您的基准测试结果!

如果你有:

lines = [ 1
     2
     3
     5
     1];


columns = [1
     2
     2
     2
     3];


values = [3
     4
     7
     3
     1];

 Q = sparse(lines, columns, values)
  (1, 1) ->  3
  (2, 2) ->  4
  (3, 2) ->  7
  (5, 2) ->  3
  (1, 3) ->  1

 [linesF, columnsF, valuesF] = find(Q)

 %% Now add the value 12 to position (3,1)
 linesF = [linesF; 3];
 columnsF = [columnsF; 1];
 valuesF = [valuesF; 12];

 Q = sparse(linesF, columnsF, valuesF)

  (1, 1) ->  3
  (3, 1) ->  12
  (2, 2) ->  4
  (3, 2) ->  7
  (5, 2) ->  3
  (1, 3) ->  1

这是有效的,因为没有任何说法必须以任何方式对行和列向量进行排序。

基准

S = sprand(10000,10000,0.0005);
tic
for ii = 1:1000
    var = S(r,c);
end
toc
Elapsed time is 0.010705 seconds.

[i,j,s] = find(S);
tic
for ii = 1:1000
    var = s((i == r & j == c);  % (r,c) is a random non-zero element in s
end
toc
Elapsed time is 0.296547 seconds.

为了支持Robert的答案 ,这里有一个快照,证明在访问稀疏矩阵的元素时没有转换为完全

在此输入图像描述

我创建了一个稀疏矩阵,如果它已满,将在RAM中占用1e5^2 * 8bytes ~ 74.5 GB 然后我检索S非零元素的下S并访问第一个元素(不失一般性)。

在图片的右侧,内存无处跳跃到> 16 GB。 当我创建S时,唯一(几乎)明显的碰撞发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM