[英]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.