2016-08-01 18 views
0

Blockの再割り当てに問題があります。Eigenのブロックをどのように変更しますか?

  1. ArrayXd 3としてS、ArrayXXd

として、各行に対して1つの

  • :以下のコードでは、私は2つの異なる方法でマトリックスAを格納します。

    // data 
    
    ArrayXXd A (3, 3); 
    A << 0, 1, 2, 3, 4, 5, 6, 7, 8; 
    
    std::vector<ArrayXd> A_rows = {A.row(0), A.row(1), A.row(2)}; 
    
    // std::vector<ArrayXd> solution 
    
    // first row 
    ArrayXd & current_row = A_rows[0]; 
    // read it, write it, do stuff 
    // start working with the second row 
    current_row = std::ref(A_rows[1]); 
    cout << current_row << endl << endl; // prints 3 4 5 
    cout << A << endl; // A is unchanged 
    
    // Eigen solution 
    
    // first row 
    Block<ArrayXXd, 1, -1> && current_row_block = A.row(0); 
    // read it, write it, do stuff 
    // start working with the second row 
    current_row_block = std::ref(A.row(1)); // doesn't compile 
    cout << current_row_block << endl; 
    cout << A << endl; 
    

    エラーメッセージは次のとおりです。

    error: use of deleted function 'void std::ref(const _Tp&&) [with _Tp = Eigen::Block<Eigen::Array<double, -1, -1>, 1, -1, false>]' 
    current_row_block = std::ref(A.row(1)); 
                ^
    

    それは第二のアプローチを修正することは可能ですか私はstd::vector<ArrayXd>として行列を格納することに移動する必要がありますか?

    関連質問:Passing a reference of a vector element to a threaded function

  • +0

    あなたは 'Eigen :: Map'の使用を避けたいですか? –

    +0

    @AviGinsburg、特にそうではありません。私は 'std :: vector 'を私が完了したときに 'ArrayXXd'に変換することを考えていました。何を思っていたんだ? – user357269

    +0

    最初に 'std :: vector 'を持っているのはなぜですか? –

    答えて

    0

    あなたは行を参照するBlock<...>は必要ありません。あなたはインデックスだけが必要です。あなたのstd::vector<ArrayXd>アプローチのために

    int current_row_id = 0; 
    std::out << A.row(current_row_id) << std::end; 
    current_row_id = 1; 
    std::out << A.row(current_row_id) << std::end; 
    

    、あなたが行のコピーを作成しているとして、あなたは元Aを変更することはできません。

    +0

    これは、2番目の行を指すようにcurrent_row_blockを再割り当てするのではなく、最初の行を上書きします – user357269

    +0

    @ user357269私の悪いです。私は演算子=がオーバーロードされていることを忘れています。 – kangshiyin

    +0

    私は実際に同様の振る舞いを持ついくつかのクラスを持っていますが、機能の一部は 'current_row'ハンドルを持つことです。クラスの1つでは、これは 'ArrayXd&'であり、別のクラスでは 'Block 'です。 'current_row'がどのように生成されるのかという内部的な動作は隠されていることが重要ですが、配列のように動作します。 – user357269

    関連する問題