6

私が本質的にやりたいことは、この関数を実装することです:

template<typename T>
Matrix<T, Dynamic, Dynamic, ColMajor>* dataToEigen(T* const data, const int rows, const int cols);

データをコピーせずに。このようなことを達成するための標準的な方法はマップを使用することだと知っていますが、このアプローチにはいくつかの問題があります。

  1. Maps を入力として受け入れるように残りのコードを書き直したくありません (Map を一時的な行列にコピーする必要はありません)。関数を一般化して MatrixBase オブジェクトを入力として受け取ることでこれを実行できることはわかっていますが、入力に特定の Matrix テンプレートを定義したのには理由があります。関数が を受け取る場合はMatrix<T, Dynamic, Dynamic, ColMajor>、そのタイプの行列のみを入力。

  2. 理想的には、作成された Matrix がデータ ポインターの所有権を取得するようにしたいので、shared_ptr を介して Matrix を管理するだけで、元のデータ ポインターに再度触れる必要はありません。

私の最初の考えは、初期化されていない動的にサイズ設定された Matrix オブジェクトを作成し、オブジェクトの次元とデータ ポインターを設定するようなことができるということでしたが、これは Eigen API では可能ではないようです。誰かが回避策を知っていますか?

4

3 に答える 3

-1

解決策は次のように簡単だと思います。

float **data = new float[numRows][numCols];
MatrixXf M(numRows,numCols);
M.data() = data;

デフォルトでは、マトリックス内のデータは列優先で編成されているため、マトリックスが float** データに行優先順にアクセスする場合は、割り当て後にマトリックスを転置できます。

于 2013-07-01T10:21:10.533 に答える