2015-11-18 9 views
12

私はEigen::MatrixXdを持っています。関数の要素を適用してすべての要素を修正したいと思います。たとえば、すべての固有行列要素に関数を適用する

MatrixXd m = ...; 

for each m[i][j]: 
    m[i][j] = exp(m[i][j]); 

この結果を得る方法はありますか?

答えて

18

はい、Eigen::MatrixBase<>::unaryExpr()メンバ関数を使用してください。例:

#include <cmath> 
#include <iostream> 

#include <Eigen/Core> 

double Exp(double x) // the functor we want to apply 
{ 
    return std::exp(x); 
} 

int main() 
{ 
    Eigen::MatrixXd m(2, 2); 
    m << 0, 1, 2, 3; 
    std::cout << m << std::endl << "becomes: "; 
    std::cout << std::endl << m.unaryExpr(&Exp) << std::endl; 
} 
+0

これは正しいでしょうか? "m.unaryExpr(&std :: exp)" –

+5

@ XingShiいいえ、['std :: exp'](http://en.cppreference.com/w/cpp/numeric/math/exp)にオーバーロードがあります。 'unaryExpr'は' std :: exp'だけからfunctorの署名を推論することができません(つまり、1つ以上の候補があります)。 'm.unaryExpr (&std :: exp)'のように、関数型を指定してコンパイラを "助け"ても動作します。 – vsoftco

+0

ありがとうございます、あなたは正しいです。 –

17

vsoftcoの答えは非常に一般的であり、カスタム関数のために良いです。しかし、一般的に使用される多くの機能には、より簡単な方法があります。この例を適用すると、arrayを使用することができ、次のようになります。

#include <iostream> 
#include <Eigen/Core> 

int main() 
{ 
    Eigen::MatrixXd m(2, 2); 
    m << 0, 1, 2, 3; 
    std::cout << m << "\nbecomes:\n"; 
    std::cout << m.array().exp() << std::endl; 
    return 0; 
} 
+0

これは知っておきたいことです! – vsoftco

関連する問題