从特征中的布尔矩阵中采样

Sampling from a boolean matrix in Eigen

本文关键字:采样 布尔矩 特征      更新时间:2023-10-16

我有一个这种形式的矩阵A:

Eigen::Matrix<bool, n, m> A(n, m)

我想在"真实"的元素中随机获得一个元素。愚蠢的方法是获得"真"元素 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 个"真"元素。

你可以

改用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);

是的,因为它是一个布尔矩阵,所以存储值也是不必要的。