2016-08-03 81 views
1

我在徵一個初學者,我在做什麼是從矩陣中提取不同行,並做一些計算。從特徵矩陣中提取矢量的正確方法是什麼?

的代碼看起來像這樣

MatrixXd mat(5, 10); 
VectorXd vec1 = mat.row(1); 
VectorXd vec2 = mat.row(2); 
// do some calculation with vec1 and vec2 

所以現在的問題是,通過做這樣VectorXd vec = mat.row(1),還有內存分配/內存複製這可能對性能不好。由於我只使用它的計算是絕對不會做的基質的任何變化之下,是否有更好的方法來做到這一點?

我試過使用Eigen::Block,但似乎Block不支持某些矩陣操作(我不確定)。

回答

2

.row()本身是不壞的表現的話,那是本徵的塊的表現之一。

塊表達式既可以用作右值,也可以用作左值。作爲 往常一樣徵表現,這種抽象具有前提是你讓你的編譯器優化零成本運行 。

如果用公式表達式計算公式,編譯器可以執行所有類型的優化。

這裏有一些例子:

mat.row(2) = 2 * mat.row(0) + mat.row(1); 
float x = (mat.row(0) - mat.row(1)).squaredNorm(); 

有了這個,你給在編譯時足夠的信息,即徵可以優化。

不知道你的意思Eigen::Block什麼,最常見的用法應該是一個矩陣的.block()https://eigen.tuxfamily.org/dox/group__TutorialBlockOperations.html