C++ 不知道大小的稀疏矩阵

C++ 不知道大小的稀疏矩阵,c++,eigen,C++,Eigen,如果大小未知,特征值是否支持元素插入稀疏矩阵 我有一个数据流进来,我正试图稀疏地存储它,但我不知道数据索引(行/列)的最大值(我可以猜测,但不能保证)。查看Eigen的插入代码,它有一个断言(1130,SparseMatrix.h),您希望插入的索引是建议仍然是将值存储到中间三元组容器中,并在最后构建稀疏矩阵。如果你不想阅读所有的流。。。然后只需读取第一个nnn三元组,直到达到所需的条件,然后将setFromTriplets()与部分三元组列表一起使用 但是,如果您仍然不想读取完整的矩阵来开始工

如果大小未知,特征值是否支持元素插入稀疏矩阵


我有一个数据流进来,我正试图稀疏地存储它,但我不知道数据索引(行/列)的最大值(我可以猜测,但不能保证)。查看Eigen的插入代码,它有一个断言(1130,SparseMatrix.h),您希望插入的索引是建议仍然是将值存储到中间三元组容器中,并在最后构建稀疏矩阵。如果你不想阅读所有的流。。。然后只需读取第一个nnn三元组,直到达到所需的条件,然后将setFromTriplets()与部分三元组列表一起使用

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

#包括
#包括
本征::SparseMatrix mat;
调整材料尺寸(100100)//初始尺寸猜测。可能是1,10,1000等等。。。
fstream输入流(“filename.txt”、“r”):
while(输入流)
{
//从流中读取位置和值
无符号i,j;
双v;
输入流>>i>>j>>v;
//检查矩阵的当前大小,必要时使其增大
如果((i>=mat.rows())| |(j>=mat.cols()))
材料(标准::max(i+1,材料行()),标准::max(j+1,材料行());
//将值存储在矩阵中
材料系数(i,j)=v;
//在这里插入在读取所有流之前要中断的条件
如果(材料非零()>150)
打破
}
//如果你认为有必要,做些清理
mat.makeCompressed();

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

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

#包括
#包括
本征::SparseMatrix mat;
调整材料尺寸(100100)//初始尺寸猜测。可能是1,10,1000等等。。。
fstream输入流(“filename.txt”、“r”):
while(输入流)
{
//从流中读取位置和值
无符号i,j;
双v;
输入流>>i>>j>>v;
//检查矩阵的当前大小,必要时使其增大
如果((i>=mat.rows())| |(j>=mat.cols()))
材料(标准::max(i+1,材料行()),标准::max(j+1,材料行());
//将值存储在矩阵中
材料系数(i,j)=v;
//在这里插入在读取所有流之前要中断的条件
如果(材料非零()>150)
打破
}
//如果你认为有必要,做些清理
mat.makeCompressed();

@πνταῥεῖ 我同意OP的观点,重复项是关于密集矩阵的。插入
SparseMatrix
对于初始化来说通常效率很低,除非您按照顺序进行操作,最好使用正确的预分配矩阵。我建议累积一个三元组列表并使用
setFromTriplets
@chtz好吧,我没有看得太近,但好的是,他们现在在他们的问题中更好地澄清了这一点。谢谢通知@OP你方的研究成果可以更好地记录/呈现。@OP你确实应该澄清你的问题,例如,“开始工作[使用矩阵]”是什么意思?您多长时间获取一次新数据(与您使用它所做的工作量相比)?太大的矩阵(最后一行/列中只有零)会有多糟糕?@πάνταῥεῖ 我同意OP的观点,重复项是关于密集矩阵的。插入
SparseMatrix
对于初始化来说通常效率很低,除非您按照顺序进行操作,最好使用正确的预分配矩阵。我建议累积一个三元组列表并使用
setFromTriplets
@chtz好吧,我没有看得太近,但好的是,他们现在在他们的问题中更好地澄清了这一点。谢谢通知@OP你方的研究成果可以更好地记录/呈现。@OP你确实应该澄清你的问题,例如,“开始工作[使用矩阵]”是什么意思?您多长时间获取一次新数据(与您使用它所做的工作量相比)?一个太大的矩阵会有多糟糕(最后一行/列中只有零)?啊,保持矩阵条目不变对我来说很重要,我没有看到。我原以为它破坏了原始数据。很好。您还可以使用
mat.reserve()
为一些预期的非零条目预先分配一些存储空间。这与std::vector::reserve的工作方式类似,这对于构建三元组形式的稀疏矩阵也很有用。啊,保持矩阵项不变对于保守调整大小很重要,我没有看到。我原以为它破坏了原始数据。很好。您还可以使用
mat.reserve()
为一些预期的非零条目预先分配一些存储空间。这与std::vector::reserve的工作方式类似,它也可用于构建三元组形式的稀疏矩阵。