2017-04-25 137 views
1

我對Eigen相對較新,在特徵中使用稀疏矩陣時遇到以下問題。特徵庫,使用稀疏矩陣的簡單線性代數運算增加分配的大小

當我使用下面的代碼時,變量C的分配大小在加法後增加到20。我失去了爲什麼會發生這種情況。

Eigen::SparseMatrix<double> A(10, 1); 
A.reserve(Eigen::VectorXi::Constant(1,3)); 

A.coeffRef(2, 0) = 2; 
A.coeffRef(3, 0) = 3; 
A.coeffRef(7, 0) = 7; 

Eigen::SparseMatrix<double> B(10, 1); 
B.reserve(Eigen::VectorXi::Constant(1,3)); 

B.coeffRef(0, 0) = 0; 
B.coeffRef(1, 0) = 1; 
B.coeffRef(8, 0) = 8; 

Eigen::SparseMatrix<double> C(10, 1); 
C.reserve(Eigen::VectorXi::Constant(1,6)); 

C = A + B; 

回答

0

它看起來像在assign_sparse_to_sparse有一行

temp.reserve((std::max)(src.rows(),src.cols())*2); 

事後,temp移動到實際的目標。這意味着,事先在您的案例中保留(和調整大小)不會有幫助。我不確定,爲什麼temp不保留給相應評估者的nonZerosEstimate()

獨立於此,如果您正在使用N x 1稀疏矩陣,則應考慮改爲使用SparseVector<double>

+0

感謝您花時間回覆。 因此,在您的意見和經驗中,您是否知道如何在不浪費我所有的記憶的情況下繼續下去?我的矩陣並不總是N×1。因此,我選擇使用列矩陣而不是稀疏向量。 – Ashesh

+0

您是否嘗試使用'temp.reserve(src.nonZeroEstimate())修補本地特徵安裝;'而不是我引用的行? – chtz

+0

我不想弄亂源代碼。在稀疏矩陣操作之後,我最終使用.squeeze功能來控制內存使用情況。 – Ashesh