2012-11-25 6 views
5

行列のブロックを関数の左辺値として返そうとしています。のは、私の関数は次のようになりましょう:結局のところ、C++コンパイラは、そのブロック()演算子は一時的な値と左辺値は、コンパイラによって禁止されているように、それを返すことができます理解しているようです固有ライブラリ:関数内の行列ブロックを左辺値として返します。

Block<Derived> getBlock(MatrixXd & m, int i, int j, int row, int column) 
{ 
    return m.block(i,j,row,column); 
} 

。しかし、Eigenのドキュメンテーションでは、左辺値としてEigenを使用できるいくつかの例があります(http://eigen.tuxfamily.org/dox/TutorialBlockOperations.html#TutorialBlockOperationsUsing)ので、私は関数で同じことをどうやってやれなかったのだろうと思います戻る。

a.block(0,0,2,3) = a.block(2,1,2,3); 

ありがとうございます!

答えて

6

私はそれが他の誰かに役立つかもしれないので、私が見つけたものを自分自身を入れたい:

私の基本的な解決策は、あなたがブロックになりたいタイプ派生かを知ることです。このケースでは:

Block<MatrixXd> getBlock(MatrixXd & m, int i, int j, int row, int column) 
{ 
    return m.block(i,j,row,column); 
} 

このメソッドは、デフォルトでは行列mの内容への参照を返します。もしそうなら、

MatrixXd m = MatrixXd::Zero(10,10); 
Block<MatrixXd> myBlock = getBlock(m, 1, 1, 3, 3); 
myBlock << 1, 0, 0, 
      0, 1, 0, 
      0, 0, 1; 

マトリックスmの内容も変更されます。ただし、

MatrixXd m = MatrixXd::Zero(10,10); 
MatrixXd myBlock = getBlock(m, 1, 1, 3, 3); 
myBlock << 1, 0, 0, 
      0, 1, 0, 
      0, 0, 1; 

は機能しません。私は、ブロックを別のタイプに変換すると、変換前にデータのコピーを作成することを理解しています。

+0

式テンプレートのおかげで、block()はブロックのコピーを実際に返しません。代わりに式 –

+0

@ user3183610を返して、ブロック(式)を評価する方法を強制します。私は有効な左辺値として意味します。 – stanleyerror

関連する問題