Matlab索引稀疏矩阵

时间:2014-04-01 14:38:23

标签: 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)的价值?

2 个答案:

答案 0 :(得分:1)

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

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.

答案 1 :(得分:1)

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

enter image description here

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

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