私はEigen::MatrixXd
を持っています。関数の要素を適用してすべての要素を修正したいと思います。たとえば、すべての固有行列要素に関数を適用する
MatrixXd m = ...;
for each m[i][j]:
m[i][j] = exp(m[i][j]);
この結果を得る方法はありますか?
私はEigen::MatrixXd
を持っています。関数の要素を適用してすべての要素を修正したいと思います。たとえば、すべての固有行列要素に関数を適用する
MatrixXd m = ...;
for each m[i][j]:
m[i][j] = exp(m[i][j]);
この結果を得る方法はありますか?
はい、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;
}
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;
}
これは知っておきたいことです! – vsoftco
これは正しいでしょうか? "m.unaryExpr(&std :: exp)" –
@ XingShiいいえ、['std :: exp'](http://en.cppreference.com/w/cpp/numeric/math/exp)にオーバーロードがあります。 'unaryExpr'は' std :: exp'だけからfunctorの署名を推論することができません(つまり、1つ以上の候補があります)。 'm.unaryExpr(&std :: exp)'のように、関数型を指定してコンパイラを "助け"ても動作します。 –
vsoftco
ありがとうございます、あなたは正しいです。 –