从Eigen中的布尔矩阵中采样

时间:2016-06-10 17:05:22

标签: c++ matrix random eigen sampling

我有这种形式的矩阵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;上述矩阵的元素。

1 个答案:

答案 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矩阵,所以存储这些值也是不必要的。