1

Eigen C++ 行列ライブラリを使用しています。行列の列への参照を取得したいと考えています。ドキュメントには、matrix_object.col(index) を使用するように記載されていますが、これは単に元のマトリックス オブジェクト内の列への参照ではなく、列を表すオブジェクトを返しているようです。列オブジェクトの値を変更しても元のマトリックスには影響しないため、これにはその列の要素の不要なコピーが含まれることが懸念されます。

私より Eigen に詳しい人がいるとしても、この関数を使用して行列の列にアクセスするのは効率的ですか? そうでない場合、マトリックス内の元の列への参照を取得するにはどうすればよいですか?

4

2 に答える 2

9

mat.col(i) は、mat の列 i を参照する軽量の読み書きプロキシ オブジェクトを返します。コピーは一切ありません。したがって、次のことができます。

mat.col(i)(j) = 2;

これは mat(j,i)=2; と同等です。次のこともできます。

mat.col(i).swap(mat.col(j));

余分なコピーなしで。コード内で、明示的に (または暗黙的に) プロキシ カラム オブジェクトを Vector オブジェクトにコピーしたのではないでしょうか? このような:

VectorXd col_of_mat = mat.col(j);
于 2012-12-09T08:03:29.970 に答える
2

まず第一に、これは明らかに列優先の行列でのみ機能します。これが Eigen のデフォルトですが、これに依存する場合は明示的にする必要があります。

次に、余分なプロキシ オブジェクト コストが発生しないことを確実にするために、 を使用data()して、マトリックス ストレージ全体へのプレーン ポインターを取得し、適切な量だけインクリメントすることができます。たとえば、行列のjth 列にアクセスするには、n×nm

auto jth_column = m.data() + n*j;

http://eigen.tuxfamily.org/dox/TopicStorageOrders.html

于 2012-12-08T23:52:34.893 に答える