2017-03-06 46 views
1

明智操作者我想有一個本徵coeffientwise操作者在返回類型從輸入矩陣類型不同,例如,本徵係數具有不同的返回類型

struct TimesPi { 
    double operator()(int v) { return 3.14 * v; } 
}; 

// in main 
Eigen::Vector3i vec_ints(1, 2, 3); 
Eigen::Vector3d vec_dbls = vec_ints.unaryExpr<TimesPi>(); 

這將導致一個編譯器錯誤消息error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY

如何生成返回不同類型的元素操作?

編輯:對於具體情況我有(不同於示例),我不能使用強制轉換(例如,與自定義標量類型)。我認爲unaryExpr在這裏使用可能是錯誤的。也許與CwiseUnaryOp?

一個更合適的例子可能是

struct SomeOperation { 
    double operator()(const Foo& v) { return v.attribute; } 
}; 

// in main 
Eigen::Matrix<Foo, 3, 1> vec_foos; 
Eigen::Matrix<double, 3, 1> = vec_foos.unaryExpr<SomeOperation>(); 
+0

我的天堂」 t使用了Eigen,但是我可以從錯誤消息中猜出它就像'vec_ints.cast ().unaryExpr ()'。 – chris

+0

對於具體情況我有(不同於示例),我不能使用強制轉換。我認爲'unaryExpr'可能是在這裏使用的錯誤的東西。也許有'CwiseUnaryOp'的東西? – Jeff

+0

這看起來像表達式模板類,不應該需要明確使用。在它的頁面上,我也看到它看起來應該直接允許'x * vec'。 – chris

回答

1

我想這只是一個簡單的例子,在你的現實世界場景的仿函數要複雜得多,不能完成通過連接標準的一元運算符。如果是這樣,那麼有兩種解決方案:

  1. 編譯C++ 11模式(例如,-std=c++11),因此本徵可以使用C++ 11的std ::的result_of的找出返回自動輸入。 (你也需要讓你的operator()常量)
  2. 如果你需要C++ 98的兼容性,那麼你必須告訴艾根的result_type如下:


#include <Eigen/Dense> 

struct TimesPi { 
    typedef double result_type; // needed for c++98/03 only 
    double operator()(int v) const { return 3.14 * v; } 
}; 

int main() 
{ 
    Eigen::Vector3i vec_ints(1, 2, 3); 
    Eigen::Vector3d vec_dbls = vec_ints.unaryExpr(TimesPi()); 
} 
+0

謝謝,這正是我正在尋找的。指定result_type用於我的自定義標量類型。 – Jeff

0

我並不像你需要使用結構來創建一個一元Expr的。爲什麼不......

Eigen::Vector3i vec_ints(1,2,3); 
Eigen::Vector3d vec_dbls = vec_ints.cast<double>() * M_PI; 

std::cout << vec_dbls << std::endl; 

回報......

3.14159 
6.28319 
9.42478 
相關問題