2015-11-06 413 views
0

我有一個不斷增長的數據庫,其形式爲Eigen::MatrixXd。我的矩陣開始爲空,並逐行添加行,直到它達到最大預定義(在編譯時已知)行數。如何爲不斷增長的Eigen預先分配內存:: MatrixXd

目前我長大這樣說,這(從本徵文檔和這裏的許多職位和其他地方):

MatrixXd new_database(database.rows()+1, database.cols()); 
new_database << database, new_row; 
database = new_database; 

但這似乎這樣更低效比它需要的,因爲它使得很多每次添加新行時無用的內存重新分配和數據複製...看起來像我應該能夠預先分配一堆尺寸爲MAX_ROWS*N_COLS的內存並讓矩陣在其中增長,但是我無法找到與std::vectorcapacity與Eigen。

注:我可能需要在實際滿之前隨時使用矩陣。所以我確實需要區分它的sizecapacity

我該怎麼做?

編輯1:我看到有一個MaxSizeAtCompileTime,但我發現文檔,而沒有實例不清楚。任何人都知道如果這是要走的路,如何使用這個參數,以及它如何與resizeconservativeResize交互?

編輯2:C++: Eigen conservativeResize too expensive?提供同時提高了關於不連續的數據問題,另一種有趣的方法...任何人對這個問題的一些很好的啓示?

+0

爲什麼不使用std :: vector? – Nandu

+0

,因爲我在做矩陣乘法。我曾想過使用'Eigen :: Vector'的std :: vector,但我認爲將Eigen :: Matrix乘以Eigen :: Vector將會比使用多個點積更加高效一個'Eigen :: Vector'在for循環中,然後用結果填充一個新的'Eigen :: Vector' ... – Julien

+0

該文檔提到保留矩陣值的conservativeResize函數。至少它可以幫助您避免從頭開始編碼調整大小。不知道它是否有更好的表現。 –

回答

2

我想提一提我忘記之前的第一件事,就是你可能要考慮使用行主要矩陣存儲。

最簡單的(也可能是最好的)解決方案,您的問題將是使用block operations訪問前行。

#include <Eigen/Core> 
#include <iostream> 

using namespace Eigen; 

int main(void) 
{ 
    const int rows = 5; 
    const int cols = 6; 

    MatrixXd database(rows, cols); 
    database.setConstant(-1.0); 

    std::cout << database << "\n\n"; 

    for (int i = 0; i < rows; i++) 
    { 
     database.row(i) = VectorXd::Constant(cols, i); 

     // Use block operations instead of the full matrix 
     std::cout << database.topRows(i+1) << "\n\n"; 

    } 

    std::cout << database << "\n\n"; 

    return 0; 
} 

而不是隻打印矩陣,你可以做任何你需要的操作。

+0

要完成答案,爲了避免每次重複'.topRows()',可以使用C++' auto「或C++ 98中聲明:Eigen :: Ref db = database.topRows(i + 1)',並將db用作常規的Eigen :: Matrix。 – ggael