具有特征的稀疏随机矩阵
Sparse Random Matrix with Eigen
是否可以使用c++特征库制作(稀疏)矩阵,类似于我需要翻译的这个优雅的python代码?
(np.random.rand(100,100) < 0.1) * np.random.rand(100,100)
。由一定比例的随机值填充的矩阵。
直接改编自特征文档,并没有那么简洁:
std::default_random_engine gen;
std::uniform_real_distribution<double> dist(0.0,1.0);
int rows=100;
int cols=100;
std::vector<Eigen::Triplet<double> > tripletList;
for(int i=0;i<rows;++i)
for(int j=0;j<cols;++j)
{
auto v_ij=dist(gen); //generate random number
if(v_ij < 0.1)
{
tripletList.push_back(T(i,j,v_ij)); //if larger than treshold, insert it
}
}
SparseMatrixType mat(rows,cols);
mat.setFromTriplets(tripletList.begin(), tripletList.end()); //create the matrix
davidhigh的回答解决了您问题的稀疏要求。然而,我不认为你的python代码实际上产生了一个稀疏矩阵,而是一个几乎为零的密集矩阵。一个同样优雅的Eigen版本可以是
MatrixXd mat;
mat2 = (MatrixXd::Random(5,5).array() > 0.3).cast<double>() * MatrixXd::Random(5,5).array();
注意,这使用了标准的c++ rand()
,因此可能不够"随机",这取决于您的需要。如果您更喜欢float
s而不是double
s,您也可以将MatrixXd
替换为MatrixXf
(也可以更改cast<...>()
)。
davidhigh的答案具有O(rows*cols)
复杂性,并且对于大型矩阵可能不切实际且耗时太长。这是一个只有O(nnz)
复杂度的改编版本。p
是期望的稀疏性。如果您的矩阵中的值需要在其他范围内,您可以调整valdis
的范围。
typedef Eigen::SparseMatrix<double, Eigen::RowMajor> SpMat;
SpMat getRandomSpMat(size_t rows, size_t cols, double p) {
typedef Eigen::Triplet<double> T;
std::random_device rd; //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_real_distribution<> valdis(0, 1.0);
std::uniform_int_distribution<> rowdis(0, rows-1);
std::uniform_int_distribution<> coldis(0, cols-1);
std::vector<Eigen::Triplet<double> > tripletList;
size_t nnz = (size_t) (rows * (cols * p));
std::set<size_t> nnz_pos;
for (size_t i = 0; i < nnz; ++i) {
auto r = rowdis(gen);
auto c = coldis(gen);
size_t pos = r * cols + c;
while (nnz_pos.find(pos) != nnz_pos.end()) {
r = rowdis(gen);
c = coldis(gen);
pos = r * cols + c;
}
nnz_pos.insert(pos);
tripletList.push_back(T(r, c, valdis(gen)));
}
SpMat mat(rows,cols);
mat.setFromTriplets(tripletList.begin(), tripletList.end()); //create the matrix
return mat;
}
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- C++ - 将 0 到 9 之间的整数设置为特征库矩阵的随机值
- 动态分配随机特征向量Xd
- 特征矩阵库在给定范围内用随机浮点值填充矩阵
- 元函数,具有对缺失特征的默认行为以及如何检测随机访问
- 特征3 矩阵随机
- 随机排列具有特征矩阵的行/列
- 特征:t 1 的随机二进制向量
- 具有特征的稀疏随机矩阵