从特征中的布尔矩阵中采样
Sampling from a boolean matrix in Eigen
我有一个这种形式的矩阵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);
是的,因为它是一个布尔矩阵,所以存储值也是不必要的。
相关文章:
- 一个关于在C++中重载布尔运算符的问题
- 提升精神:解析布尔表达式并简化为规范范式
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 线程之间的布尔停止信号
- 布尔比较运算符是如何在C++中工作的
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 隐式常量/非常量运算符布尔
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 如何在 c++ 中让布尔变量返回为 0 或 1 而不是真或假?
- 重载更少,则运算符返回相反的布尔值
- 将布尔变量添加到 int
- C++函数中的精确"return"矩
- 为什么布尔开关语句有编译器警告?
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何使布尔变量仅在设置为 true 时才为真?
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 从特征中的布尔矩阵中采样