2015-11-18 96 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'單獨推導函子簽名(即,有超過1個候選)。如果你通過指定函子類型來「幫助」編譯器,比如'm.unaryExpr (&std :: exp)',它就可以工作。 – vsoftco

+0

非常感謝,你是對的。 –

17

vsoftco的回答很一般,對自定義功能很好。但是,對於許多常用功能來說,有一種更簡單的方法。調整他的例子,我們可以使用array s,它看起來像這樣:

#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