2017-09-22 16 views
0

此工程操作C++固有塊在模板函數採取DenseBase

Vector2d a(1,2); 
VectorXd cc(10); 
cc << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9; 
VectorXd rr(10); 
rr << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9; 
int R(10); 
Vector2d G(Vector2d::Zero()); 


G.noalias() -= cc.segment(4, 2) + 
       (rr.segment(1, 2) - R*Vector2d::Ones()).cwiseQuotient(a); // OK here 

但當rr.segment(1,2)被作爲參數傳遞給函數,在最後一行的操作符 - 不編譯。在此代碼

template <typename DerivedA, typename DerivedB, typename DerivedC> 
void testFunc(MatrixBase<DerivedA>& G, const DenseBase<DerivedB>& c, const DenseBase<DerivedC>& r) 
{ 
    Vector2d a(1,2); 
    int R(10); 
    G.noalias() -= c + (r - R*Vector2d::Ones()).cwiseQuotient(a); 
}; 

VectorXd cc(10); 
cc << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9; 
VectorXd rr(10); 
rr << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9; 
Vector2d G(Vector2d::Zero()); 
testFunc(G, cc.segment(4, 2), rr.segment(1, 2)); // ERROR : no match for 'operator-' 

據我所知,該問題是在於,在testFunc(),cc.segment被看作是該操作符 - 未實現的一般DenseBase對象的事實,會出現問題,但它是爲特定的類.block()實現。

+0

testFunc實現對矩陣表達式起作用,所以它應該使用MatrixBase <>參數(即添加一個Vector2d是一個矩陣操作)。你爲什麼要服用DenseBase <>的? –

+0

因爲我將.block()作爲參數傳遞 – itQ

+0

AFAIR,矩陣表達式的一個塊仍然是一個矩陣表達式,因此應該匹配MatrixBase <> ...(即用代碼中的MatrixBase <>替換DenseBase <>對我來說很好) –

回答

1

您可以通過編寫c.derived()和來告訴Eigen使用DenseBase類封裝的實際類型。

無關:相反R*Vector2d::Ones()Vector2d::Constant(R)的,如果整個表達式爲元素的運算,你應該在Array領域工作反正:

template <typename DerivedA, typename DerivedB, typename DerivedC> 
void testFunc(MatrixBase<DerivedA>& G, const DenseBase<DerivedB>& c, const DenseBase<DerivedC>& r) 
{ 
    Array2d a(1,2); 
    int R(10); 
    G.array() -= c.derived().array() + (r.derived().array() - R)/a; 
} 

(你可以離開,如果你所有的.derived().array()通過ArrayBase而不是MatrixBaseDenseBase

而且,.noalias()只有在涉及矩陣產品時纔是必需的。