Iを繰り返し要素なし、VectorXd
形態で対称行列の内容を返し、次のシグネチャベクタライズ対称行列
VectorXd vectorize (const MatrixXd&);
と機能を記述したいと思います。例えば、
int n = 3; // n may be much larger in practice.
MatrixXd sym(n, n);
sym << 9, 2, 3,
2, 8, 4,
3, 4, 7;
std::cout << vectorize(sym) << std::endl;
は返す必要があります:
9
2
3
8
4
7
vec
内の要素の順序は、それが体系的で提供し、重要ではありません。私の目的にとって重要なことは、sym
のデータを繰り返し要素なしで返すことです。なぜなら、sym
は常に対称であるとみなされるからです。つまり、sym
の上三角「ビュー」の要素をVectorXd
という形式で返したいと考えています。
vectorize
はネストされたfor
ループで実装されていますが、この機能はプログラム内で頻繁に呼び出されることがあります(100万回以上)。私の質問はこうです:vectorize
を書くのに最も計算効率の良い方法は何ですか?私はEigenのtriangularView
を使用したいと考えていましたが、私はどのように見えません。
ありがとうございます。
あなたは 'TriangularView'と' Map'を使う必要があるようです。 – TriskalJM
この機能要求は関連しています:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=42(別の方法として、特にコメント2を参照してください。多かれ少なかれ手動で、しかし)。 – chtz