对均匀随机矩阵进行高效采样
Efficiently sampling a uniform random matrix
我需要采样一个巨大的随机矩阵,其大小为 499 x 15500
,即 7734500
元素。出于这个原因,我希望抽样程序尽可能有效。目前,在 cpp 文件中,我正在这样做:
std::random_device rd; // seed generator
std::mt19937_64 generator{rd()}; // generator initialized with seed from rd
std::uniform_int_distribution<> initialize(unsigned long long int modulus)
{
std::uniform_int_distribution<> unifDist{0, (int)(modulus-1)};
return unifDist;
}
Matrix<unsigned int> uniformRandomMatrix
(unsigned int rows, unsigned int columns, unsigned long long int modulus)
{
std::uniform_int_distribution<> dist = initialize(modulus);
// Declare and allocate the matrix
Matrix<unsigned int> matrix(rows, columns);
// this constructor just does a resize on a std::vector
// Fill the matrix with random elements
for(unsigned int i = 0; i < rows; ++i)
{
for(unsigned int j = 0; j < columns; ++j)
{
matrix.setElementAt(i, j, dist(generator));
// setElementAt just does matrix[somePosition] = newElement
}
}
return matrix;
}
请注意,为了提高效率,Matrix
是作为一维std::vector
实现的。
我能做得比这更好吗?现在,对这个巨大的矩阵进行采样大约需要0.16秒。
使用std::vector::data
编辑
新方法是这样的:我在Matrix
类中添加了一个方法
inline std::vector<T> exposeVector()
{
return matrix; // 'matrix' is the name of the private std::vector
}
然后取样制服Matrix
Matrix<unsigned int> uniformRandomMatrix
(unsigned int rows, unsigned int columns, unsigned long long int modulus)
{
std::uniform_int_distribution<> dist = initialize(modulus);
// Declare and allocate the matrix
Matrix<unsigned int> matrix(rows, columns);
std::vector<unsigned int> v = matrix.exposeVector();
unsigned int* p = v.data();
for(unsigned int i = 0 ; i < rows*columns ; ++i)
{
*p = dist(generator);
++p;
}
return matrix;
}
一切似乎都很好,但我在性能方面没有获得任何好处。
在我看来,这是一个相当广泛的问题,但我会尝试给你一些指示:
- 首先,也可能是最明显的事情是在多个线程中执行此操作
std::thred
- 如果你的矩阵是一个派生类,而你的
setElementAt
是虚拟的,那么由于 vtable 解析,它的成本真的很高。摆脱它(见下一行) - 通常编译器已经做了很多优化,但你仍然可以尝试最小化函数/方法调用,通过公开你的vector::d ata并迭代为单个数组
for(int i = 0; i < rows*cols; i++); data[i] = random
或尝试std::generate。
相关文章:
- C++中高效的大型稀疏块压缩线性方程
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 如何在C++中高效地构造随机骰子
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 如何使用采样器立方体作为数组
- 更高效地在微控制器上对C++进行基准测试
- 从C++无序集合中高效提取元素
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- C++中特征对角矩阵类型的高效存储
- 高效简单的结构比较运算符
- 多重采样背景不显示
- 如何从wav文件中获取采样率?
- 使用 Rcpp 的高效矩阵子集
- C++ 包含特征矩阵的类的高效算术运算符重载
- CUDA 高效的 nd-array(张量)切片
- 大多数基本类型的高效二进制序列化
- RAM高效C++属性
- 是否有 C++/C 的高效构建功能可以快速均匀地对 b 条目进行采样,而无需替换 n 个条目?
- 对均匀随机矩阵进行高效采样