我有这种形式的矩阵A:
Eigen::Matrix<bool, n, m> A(n, m)
我希望在那些真正的&#39;中获得一个随机元素。这样做的愚蠢方法是获得“真实”的数字。元素t,生成1到t之间的随机数并迭代:
//r = random number
int k = 0;
for (int i = 0; i < A.rows(); ++i)
for (int j = 0; j < A.cols(); ++j)
{
if (A(i, j))
++k;
if (k == r)
std::cout << "(" << i << ", " << j << ")" << std::endl;
}
当需要多个样本且矩阵很大时,此解决方案非常慢。关于我应该怎么做的任何建议?
简而言之:我想找到一种有效的方式来获得第i个真实的&#39;上述矩阵的元素。
答案 0 :(得分:1)
您可以改用Eigen::SparseMatrix
。
Eigen::SparseMatrix<bool> A(n, m);
使用其压缩(或非)列/行存储方案,您可以在O(m)/ O(n)时间内找到r
非零元素,或者O(log(m) )二进制搜索。
您可以使用COO格式实用程序Eigen::Triplet
在O(1)时间内找到r
非零元素。
std::vector<Eigen::Triplet<bool> > a(num_nonzeros);
是的,因为它是一个bool矩阵,所以存储这些值也是不必要的。