プログラムの線形代数エンジンとしてEigen行列ライブラリを使用したいと思います。Eigenは、式テンプレートを使用して遅延評価を実装し、ループと計算を簡素化します。
例えば:
#include<Eigen/Core>
int main()
{
int size = 40;
// VectorXf is a vector of floats, with dynamic size.
Eigen::VectorXf u(size), v(size), w(size), z(size);
u = 2*v + w + 0.2*z;
}
Eigenは式テンプレートを使用するため、次のようなコードを使用します
u = 2*v + w + 0.2*z;
上記のサンプルでは、一時的なものを作成せずに、長さ10の単一ループに縮小されます(40ではなく、フロートは4のチャンクによってレジストラに入れられます)。それはどれくらいクールですか?
しかし、このようにライブラリを統合すると、次のようになります。
class UsingEigen
{
public:
UsingEigen(const Eigen::VectorXf& data):
data_(data)
{}
UsingEigen operator + (const UsingEigen& adee)const
{
return UsingEigen(data_ + adee.data_);
}
...
private:
Eigen::VectorXf data_;
}
次に、次のような式:
UsingEigen a, b, c, d;
a = b + c + d;
Eigenの実装方法を利用することはできません。そして、これが最後ではありません。Eigenで式テンプレートが使用されている例は他にもたくさんあります。
簡単な解決策は、演算子を自分で定義せずにdata_
公開し、次のような式を記述することです。
UsingEigen a, b, c, d;
a.data_ = b.data_ + c.data_ + d.data_;
これはカプセル化を破りますが、Eigenの効率を維持します。
他の方法は、独自の演算子を作成することですが、式テンプレートを返すようにします。しかし、私はC ++の初心者なので、これが正しい方法かどうかはわかりません。
質問が一般的すぎる場合は申し訳ありません。私は初心者で、誰にも尋ねることはありません。今まではstd::vector<float>
どこでも使っていましたが、今は行列も使う必要があります。プロジェクト全体でEigenに切り替えることstd::vector<float>
は大きな一歩であり、最初から間違った電話をかけることを恐れています。どんなアドバイスも歓迎します!