2015-11-18 17 views
12

için geçerli bir işlev var. Eigen::MatrixXd var ve tüm bileşenlerini bir işlev bileşeni ile uygulayarak değiştirmek istiyorum. Örneğin:Tüm Eigen matris öğesi

MatrixXd m = ...; 

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

Bu sonuca ulaşmanın bir yolu var mı?

cevap

18

Evet, Eigen::MatrixBase<>::unaryExpr() üye işlevini kullanın. Örnek:

#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

bu doğru olur mu? "m.unaryExpr (& std :: exp)" –

+5

@XingShi Hayır, çünkü ['std :: exp'] (http://en.cppreference.com/w/cpp/numeric/math/exp) aşırı yüklenmelere sahiptir ve 'unaryExpr', sadece std :: exp'den functor imzayı çıkaramaz (yani, 1'den fazla aday vardır). "M.unaryExpr (& std :: exp)' gibi functor türünü belirterek derleyiciye "yardım ederseniz" çalışır. – vsoftco

+0

Çok teşekkürler, haklısınız. –

17

vsoftco 'ın cevabı çok genel ve özel işlevler için iyidir. Bununla birlikte, yaygın olarak kullanılan işlevlerin çoğu için daha basit bir yol vardır. Onun örneğini uyarlayarak array s kullanabiliriz ve şu şekilde görünür:

#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

Bunu bilmek güzel! – vsoftco