1

次のような行マトリックスを引数として取るメソッドを作成しています。

method(Matrix<float,1,Dynamic>& rowMatrix);

次のように、Matrix.row(x) の結果を使用してメソッドを呼び出そうとすると、次のようになります。

Matrix<float,Dynamic,Dynamic> matrix(2,2);
method(matrix.row(1));

次のエラーが表示されます。

no known conversion for argument 1 from ‘Eigen::DenseBase<Eigen::Matrix<float, -1, -1> >::ColXpr {aka Eigen::Block<Eigen::Matrix<float, -1, -1>, -1, 1, true, true>}’ to ‘Eigen::Matrix<float, -1, 1>&’

Matrix<float,1,Dynamic>ここでの問題は、への参照を に代入しようとしていることだと理解していますがColXpr、これは有効ではないようです。ColXpr値を渡すことで問題を「解決」できます。この場合、引数コンストラクターを使用して新しいマトリックスが構築され、すべて正常に機能すると思います。

メソッド内のマトリックスを変更していないため、値渡しは「許容」されます。ただし、データのコピーを回避してパフォーマンスを向上させるために、参照渡しを行いたいと考えています。Matrix::row()の戻り値からに割り当て可能なものに変換する方法はありますMatrix<datatype,1,Dynamic>&か?

4

1 に答える 1

3

それは不可能ですが、次の 2 つのオプションがあります。

  1. Eigen manualで説明されているように、関数テンプレートを作成します。

  2. テンプレート関数を作成できない場合は、devel ブランチで利用できるRef<>クラスが正しい答えです。基本的に、それは次のように要約されます。

    method(Ref<Matrix<float,1,Dynamic>, 0, InnerStride> rowMatrix);

    または const バージョン:

    method(const Ref<const Matrix<float,1,Dynamic>, 0, InnerStride<> >& rowMatrix);

于 2013-02-14T17:41:13.903 に答える