我有一个稀疏逻辑矩阵,它非常大。我希望能够从中随机提取非零元素,而不需要将所有非零元素存储在单独的向量中(例如通过使用查找命令)。有没有简单的方法可以实现这个功能?
目前,我正在实现拒绝抽样(rejection sampling),即随机选择一个元素并检查它是否为非零。但当非零元素比例较小时,效率不高。
目前,我正在实现拒绝抽样(rejection sampling),即随机选择一个元素并检查它是否为非零。但当非零元素比例较小时,效率不高。
如果你想要选择随机位置,那么一个稀疏逻辑矩阵并不是一个非常实用的数据表示方式。在我看来,拒绝抽样和find
是唯一有意义的两种方法。以下是如何高效地执行它们(假设你想要获取4个随机位置):
%# using find
idx = find(S);
%# draw 4 without replacement
fourRandomIdx = idx(randperm(length(idx),4));
%# draw 4 with replacement
fourRandomIdx = idx(randi(1,length(idx),4));
%# get row, column values
[row,col] = ind2sub(size(S),fourRandomIdx);
%# using rejection sampling
density = nnz(S)/prod(size(S));
%# estimate how many samples you need to get at least 4 hits
%# and multiply by 2 (or 3)
n = ceil( 1 / (1-(1-density)^4) ) * 2;
%# random indices w/ replacement
randIdx = randi(1,n,prod(size(S)));
%# identify the first four non-zero elements
[row,col] = find(S(randIdx),4,'first');
find 是获取稀疏矩阵中非零元素的标准接口。请在这里查看 http://www.mathworks.se/help/techdoc/math/f6-9182.html#f6-13040
[i,j,s] = find(S)
find函数返回向量i中非零值的行索引,向量j中的列索引以及向量s中的非零值本身。
不需要获取向量s。只需在i、j中随机选择一个索引即可。
sparse()
的前身),或使用find
命令,例如[i,j,s] = find(S);
如果您不需要条目,似乎确实如此,您只需提取i
和j
。sum
,您可以获得每列计数(假设您的条目只是1)。
nonzeros
应该比find
稍微更节省一些内存,因为您不需要存储行和列的索引。 - Richie Cotton