我發現與本徵對象作爲參數繁瑣的功能設計。雖然Eigen Documentation中的信息很有幫助,但它爲模板參數提供了一種尷尬的方法。假設,我們想寫一個幾何例程,如線平面交點。一個簡單而透明的做法是:最佳實踐作爲參數
template<typename _Tp>
bool planeLineIntersect(const Eigen::Matrix<_Tp, 3, 1>& planePoint,
const Eigen::Matrix<_Tp, 3, 1>& planeNormal,
const Eigen::Matrix<_Tp, 3, 1>& linePoint,
const Eigen::Matrix<_Tp, 3, 1>& lineDir,
Eigen::Matrix<_Tp, 3, 1>& intersectionPoint)
這看起來比較悅目的人,看起來在這個可以學習,每個參數都必須是同一類型的3D矢量。但是,直接地,這不允許任何類型的Eigen表達式(我們必須爲每個表達式調用Eigen :: Matrix構造函數,我們使用它)。因此,如果使用表達式,我們需要創建不必要的臨時對象。
建議的解決方案是:
template<typename Derived1, typename Derived2, typename Derived3, typename Derived4, typename Derived5>
bool planeLineIntersect(const Eigen::MatrixBase<Derived1>& planePoint,
const Eigen::MatrixBase<Derived2>& planeNormal,
const Eigen::MatrixBase<Derived3>& linePoint,
const Eigen::MatrixBase<Derived4>& lineDir,
const Eigen::MatrixBase<Derived5>& intersectionPoint)
這並沒有透露任何關於預計的矩陣,也沒有哪個參數用於輸入和輸出,因爲我們有一個常量播的intersectionPoint允許輸出參數中的表達式。據我所知,這是允許所有功能參數中的Eigen表達式的唯一方法。儘管表達不夠支持,但第一部分仍然看起來更可愛。
我的問題:
- 你會考慮第二代碼片段在這個例子中的最佳解決方案?
- 你曾經使用的輸出參數的常量播解決方案或者你認爲這是不值得的透明度的損失?
- 您使用Eigen函數書寫的哪些準則/最佳實踐?
爲什麼你認爲使用輸出參數不是一個好方法?我發現一個函數對象爲此目的有點臃腫。有或沒有表達式,這樣的對象將不得不爲結果分配內存。另外,我需要額外的代碼行來進行構建/初始化並讀取結果。我在代碼中不使用特徵類型,因爲我做了很多幾何計算,並且需要將歸一化的數量保持爲最小(儘管這個函數不是那麼好的例子)。 –