不知道大小的稀疏矩阵
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();
如果大小未知,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();