不知道大小的稀疏矩阵

Sparse matrix without knowing size

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

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

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

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

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

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

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

#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();