TLDR: напишите что-то вроде этого:
CoefficientMatrix A(2*N, 9);
for (int i = 0; i < N; i++) {
CoefficientRow ax;
CoefficientRow ay;
// fill in ax and ay
A.row(2*i) = ax;
A.row(2*i+1) = ay;
}
Причина вашей ошибки в том (как объяснил Ави), что operator<<
предназначен для заполнения всей матрицы сразу. Фактически, вызов operator<<(Array &A, Array const &b)
присваивает b
верхнему левому углу A
и возвращает прокси-объект, который содержит ссылку на A
и отслеживает, сколько записей A
уже присвоено(сохраняется в m_row
, m_currentBlockRows
, m_col
) и перегружает operator,
, что присваивает следующее выражение соответствующей позиции a
и соответственно увеличивает позицию. Наконец, когда этот прокси-объект разрушается (что обычно происходит «на ;
»), деструктор проверяет, все ли записи в A
заполнены (и выдает ошибочное утверждение, если нет).
Если вы предпочитаете использовать синтаксис << ,
, вы также можете написать:
A.middleRows<2>(2*i) << ax, ay;
С включенной оптимизацией, которая должна генерировать тот же код, что и простая реализация, описанная выше (поэтому выберите тот, который вам легче читать).
Примечание: технически (ab) вы можете использовать (10) * * * в цикле, создав его вне цикла, присвоив его переменной, а затем используя только оператор ,
внутри цикла. ,Я намеренно не буду более подробно рассказывать, как это сделать ...