从 Eigen 中的布尔矩阵采样
Sampling from a boolean matrix in Eigen
我有一个这种形式的矩阵 A:
Eigen::Matrix<bool, n, m> A(n, m)
我想在 'true' 中随机获取一个元素。愚蠢的做法是获取 'true' 个元素 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 个 'true' 元素。
您可以改用 Eigen::SparseMatrix
。
Eigen::SparseMatrix<bool> A(n, m);
通过其压缩(或未压缩)column/row 存储方案,您可以在 O(m)/O(n) 时间内找到第 r
个非零元素,或者 O( log(m)) 与二进制搜索。
您可以使用 COO format utility Eigen::Triplet
在 O(1) 时间内找到第 r
个非零元素。
std::vector<Eigen::Triplet<bool> > a(num_nonzeros);
是的,因为它是一个 bool 矩阵,所以也不需要存储值。
我有一个这种形式的矩阵 A:
Eigen::Matrix<bool, n, m> A(n, m)
我想在 'true' 中随机获取一个元素。愚蠢的做法是获取 'true' 个元素 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 个 'true' 元素。
您可以改用 Eigen::SparseMatrix
。
Eigen::SparseMatrix<bool> A(n, m);
通过其压缩(或未压缩)column/row 存储方案,您可以在 O(m)/O(n) 时间内找到第 r
个非零元素,或者 O( log(m)) 与二进制搜索。
您可以使用 COO format utility Eigen::Triplet
在 O(1) 时间内找到第 r
个非零元素。
std::vector<Eigen::Triplet<bool> > a(num_nonzeros);
是的,因为它是一个 bool 矩阵,所以也不需要存储值。