不知道大小的稀疏矩阵

时间:2021-03-05 10:58:49

标签: c++ eigen

如果大小未知,Eigen 是否支持将元素插入到稀疏矩阵中?

我有一个数据流进来,我试图稀疏地存储它,但我不知道提前数据的索引(行/列)的最大值(我可以猜到,但是不保证)。查看 Eigen 的插入代码,它有一个断言 (1130, SparseMatrix.h),即您希望插入的索引是 <=rows(), <=cols()。

我真的需要等到我拥有所有数据才能开始使用 Eigen 的稀疏矩阵代码吗?我必须采用的设计要求我等待所有数据,然后扫描以找到最大索引,这对我的应用程序来说并不理想。我目前不需要完整的矩阵来开始工作 - 一个具有当前可用数据的有限矩阵就可以了。

除非您有答案,否则请不要关闭此问题,链接的答案是针对密集矩阵,而不是稀疏矩阵,它们具有不同的内部存储...

我也在寻找关于矩阵大小在运行时而不是在编译时立即可用的情况的信息,而olny用于稀疏。

1 个答案:

答案 0 :(得分:2)

建议仍然将值存储到中间的三元组容器中,并在最后构建稀疏矩阵。如果您不想读取所有流...那么只需读取第一个 nnn 三元组直到您想要的条件,然后将 setFromTriplets() 与部分三元组列表一起使用。

但是,如果您仍然不想读取完整矩阵以开始工作,您可以猜测矩阵的大小并使其增长,以防您使用 { 读取无法以当前大小存储的值{3}}。

#include <Eigen/Sparse>
#include <iostream>
 
Eigen::SparseMatrix<double> mat;
mat.resize(100,100); //Initial size guess. Could be 1, 10, 1000, etc...


fstream inputStream ("filename.txt", "r"):
while(inputStream)
{
    //Read position and value from stream
    unsigned i, j;
    double v;
    inputStream >> i >> j >> v;

   //check current size of the matrix and make it grow if necessary
   if ( (i >= mat.rows()) || (j >= mat.cols()) )
      mat.conservativeResize(std::max(i+1, mat.rows()), std::max(j+1, mat.cols()) );

   //store the value in matrix
   mat.coeffRef(i,j) = v;

   //Insert here your condition to break before of read all the stream
   if (mat.nonZeros() > 150 )
      break;
}

//Do some clean-up in case you think is necessary
mat.makeCompressed();