2016-08-01 2 views
0

У меня возникли проблемы с переназначением Block. В коде ниже я хранить матрицу A двумя различными способами:Как вы меняете блок в Eigen?

  1. как 3 ArrayXd с, по одному для каждой строки
  2. как ArrayXXd

.

// 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<...> ссылаться на строку. Вам нужен только индекс.

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; 

Для вашего std::vector<ArrayXd> подхода, как и вы сделать копии строк, вы не можете изменить оригинальный A.

+0

Это вместо того, чтобы переназначить current_row_block, чтобы указать на вторую строку, перезаписывает первую строку – user357269

+0

@ user357269 my bad. Я забыл оператор = был перегружен. – kangshiyin

+0

У меня на самом деле есть несколько классов с аналогичным поведением, и часть функциональности состоит в том, чтобы иметь дескриптор 'current_row'. В одном из классов это «ArrayXd &», в другом - «Block ». Важно, чтобы внутренняя работа как 'current_row' была спрятана, но она ведет себя как массив. – user357269

Смежные вопросы