![](/img/trans.png)
[英]Defining an AnsiString matrix in Borland C++ builder without knowing the size
[英]Sparse matrix without knowing size
如果大小未知,Eigen 是否支持將元素插入到稀疏矩陣中?
我有一個 stream 數據進來,我試圖稀疏地存儲它,但我不知道數據索引(行/列)的最大值(我可以猜測,但不能保證) . 查看 Eigen 的插入代碼,它有一個斷言 (1130, SparseMatrix.h),您希望插入的索引是 <=rows(), <=cols()。
我真的需要等到我擁有所有數據才能開始使用 Eigen 的稀疏矩陣代碼嗎? 我必須使用 go 的設計,然后我需要等待所有數據,然后掃描找到最大索引,這對我的應用程序來說並不理想。 我目前不需要完整的矩陣來開始工作 - 使用當前可用數據的有限矩陣就可以了。
除非您有答案,否則請不要關閉此問題,鏈接的答案適用於密集矩陣,而不是稀疏矩陣,它們具有不同的內部存儲......
我還在尋找有關矩陣大小在運行時而不是在編譯時不能立即獲得的情況的信息,並且 olny 表示稀疏。
建議仍然是將值存儲到中間三元組容器中,並在最后構建稀疏矩陣。 如果您不想閱讀所有 stream... 那么只需閱讀第一個 nnn 三元組,直到您想要的條件,然后使用 setFromTriplets() 和部分三元組列表。
但是,如果您仍然不想讀取完整的矩陣以開始工作,您可以猜測矩陣的大小並使其增長,以防您讀取的值無法存儲在您當前的大小中。
#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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.