簡體   English   中英

將 MatrixXd 的行傳遞給 function 進行修改而不在 Eigen 中創建副本

[英]Passing rows of a MatrixXd to a function to be modified without creating copies in Eigen

這個問題與 C++ 和 Eigen 有關。

我有一個 function 計算一些向量作為Eigen::VectorXd並將它們存儲到作為參數傳遞的向量中。 function 的返回值是在 function 中完成的迭代次數。 下面是function的偽代碼:

size_t integrate(Eigen::VectorXd& v) {
    size_t numIterations = 0;
    // do some iterative calculations and increment numIterations
    // vNew is generated from the new calculations
    v = vNew;
    return numIterations;
}

我想使用這個 function 的方式如下:

Eigen::MatrixXd q = Eigen::MatrixXd::Zero(numRows, numCols);

for(size_t i = 0; i < numSteps; i++) {
    integrate(q.row(i));
}

但是,這不會在 Visual Studio 中編譯。 我得到一個C++ initial value of reference to non-const must be an lvalue編譯器錯誤。 我的目的是避免不必要的復制,並在 for 循環的每次迭代中將計算結果(向量)放入矩陣中。 我知道row()不返回VectorXd 我已經嘗試了一些其他的東西,但都沒有奏效。 在 Eigen 中填充預先分配的MatrixXd行的有效方法是什么?

注意:我知道我可以通過 ref 將矩陣與i的當前值一起傳遞給 function 並執行q.row(i) = vNew; integrate()中。 然而,它看起來很丑陋,對我來說是不必要的。 integrate()真的不需要知道任何關於MatrixXd的事情。

謝謝你。

您可以使用Eigen::Ref object 將可寫引用傳遞給矩陣塊。 在您的情況下,由於(主要列)矩陣的行將具有內部跨度,因此您需要明確允許:

size_t integrate(Eigen::Ref<Eigen::VectorXd, 0, Eigen::InnerStride<> > v) {
    v.setRandom(); // use `v` as if it was a VectorXd
    return 0;
}

為了獲得更好的性能,您應該考慮以行主要形式存儲q ,或者將各個列傳遞給integrate

Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> q; q.setZero(numRows, numCols);
// ...
integrate(q.row(i));

或者:

Eigen::MatrixXd q; q.setZero(numRows, numCols); // you'll need to switch how many rows and cols are to be allocated
// ...
integrate(q.col(i));

在任何一種情況下, integrate都可以采用簡單的Eigen::Ref<Eigen::VectorXd> (又名Eigen::Ref<Eigen::VectorXd, 0, Eigen::InnerStride<1> > ):

size_t integrate(Eigen::Ref<Eigen::VectorXd> v) {
    // ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM