2017-06-24 50 views
0

我正在爲我的項目編寫一個簡單的界面,介於std::vector特徵之間。對於簡單的矩陣 - 矩陣乘法碼:獲取特徵矩陣元素類型的好方法

template<typename MatrixElementType1, typename MatrixElementType2> 
    inline auto _matmat(const vector<MatrixElementType1>& Mat1, 
         const vector<MatrixElementType2>& Mat2, 
         const size_t M, const size_t N, const size_t K) 
    { 
     using MatrixType1 = Matrix<MatrixElementType1, Dynamic, Dynamic>; 
     using MatrixType2 = Matrix<MatrixElementType2, Dynamic, Dynamic>; 
     Map<const MatrixType1> m1(Mat1.data(), M, N); 
     Map<const MatrixType2> m2(Mat2.data(), N, K); 
     auto rst = m1 * m2; 
     return vector<???>(rst.data(), rst.data() + rst.size()); 

    } 

問題是我應該用什麼? ..我知道decltype(rst(0,0))作品,但是有更加優雅的方式嗎?這似乎爲decltype(rst)::value_type本徵矩陣不工作..

+1

使用'auto' near表達式模板?你喜歡住危險... –

+0

這將是完美的,如果我可以決定哪些類型以使用簡單地基於'MatrixElementType1'和'MatrixElementType2' ..但我不知道該怎麼做 –

+0

事實證明,我必須執行如果'MatrixElementType1'不等於'MatrixElementType2',但問題仍然存在,乘以矩陣前投:我應該投'Mat1'到'MatrixElementType2'或者我應該投'Mat2'到'MatrixElementType1' .. –

回答

1

首先,因爲m1*m2返回表達式和產品沒有結果,你需要評估它明確如果使用自動:

auto rst = (m1 * m2).eval(); 

然後,您可以使用decltype(rst)::Scalar獲得標量類型。一個更好的策略雖然可能是聲明適當類型和大小的std :: vector,並將其映射:

typedef decltype(m1*m2)::Scalar ResScalar; 
vector<ResScalar> res(M,K); 
Matrix<ResScalar,Dynamic,Dynamic>::Map(res.data(),M,K).noalias() = m1*m2; 
return res; 
+0

沒?沒有意識到存在'標量',謝謝。雖然比我的版本更好,但如果兩種類型是'double'和'int',這仍然不起作用,因爲在我調用'm1 * m2'之前我必須_cast_(否則eigen會拋出長的錯誤...)。我目前所做的是通過'decltype(static_cast (1)* static_cast (1));'然後按照上面的代碼映射它。 –