假设我们有这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)
的价值?
答案 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 ,这里有一个快照,证明在访问稀疏矩阵的元素时没有完全转换
我创建了一个稀疏矩阵,如果它已满,它将在RAM中占用1e5^2 * 8bytes ~ 74.5 GB
。
然后我检索S
的非零元素的下标并访问第一个元素(不失一般性)。
在图片的右侧,内存没有跳转到> 16 GB。当我创建S
时,会发生唯一(几乎)明显的碰撞。