3

非常に大きな対称行列 (~800mb) を使用して線形代数を実行しており、いくつかの異なる分解を試しています。現在、私は LDLT を実装しています。これを利用して、行列の上三角を L^T で上書きすることにより、メモリ要件を半分にしたいと考えています。Eigen のドキュメントにはこれを実行する方法が記載されていませんが、内部名前空間にはいくつかの隠しメソッドがあり、私が望むことを実行できる可能性があります。

メソッドは、次の構造体template<> struct ldlt_inplace<Lower>http://eigen.tuxfamily.org/dox/LDLT_8h_source.htmltemplate<> struct ldlt_inplace<Upper>に あります。

これらのメソッドが私が望むものであるというのは正しいですか? それらをどのように使用しますか?それらは内部的なものであり、変更や非推奨になる可能性があるため、使用を避けるべきですか?

4

1 に答える 1

2

Internal は実際、この関数のプロトタイプが将来のバージョンで変更される可能性があることを意味します。LDLT::compute() メソッドは、その使用方法の良い例です。

Transpositions<Dynamic> T(mat.cols());
VectorXd temp(mat.cols());
int sign;
Eigen::internal::ldlt_inplace<Eigen::Lower>::unblocked(mat, T, temp, &sign);

編集

Eigen 3.3 では、以下を使用できますLDLT<Ref<MatrixXd> >

MatrixXd A;
LDLT<Ref<MatrixXd> > ldlt(A);

ldltその後、それ自体で因数分解AAます。詳細については、ドキュメントを参照してください。

于 2013-08-10T08:34:28.207 に答える