7

行列のブロックを関数の左辺値として返そうとしています。私の関数が次のようになっているとしましょう:

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

結局のところ、C ++コンパイラはblock()演算子が一時的な値のみを与えることを理解しているため、それを左辺値として返すことはコンパイラによって禁止されているようです。ただし、Eigenのドキュメントには、Eigenを左辺値として使用できる例がいくつかあります(http://eigen.tuxfamily.org/dox/TutorialBlockOperations.html#TutorialBlockOperationsUsing)ので、関数で同じことができないのではないかと思います。戻る。

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

ありがとうございました!

4

2 に答える 2

8

自分で見つけたものを載せたいので、他の人に役立つかもしれません:

私の基本的な解決策は、ブロックに必要な派生型を知ることです。この場合:

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;

動作しないでしょう。私の理解では、ブロックを別の型に変換すると、Eigen は変換前にデータのコピーを作成します。

于 2012-12-06T08:07:30.810 に答える