Я хочу преобразовать каждый столбец матрицы M с помощью оператора N. Эйген позволяет выразить это в терминах предварительного умножения:
M.colwise() *= N;
Но умножение M_j * N
математически не определено.
Есть ли способ избежать написания цикла?
Если вы хотите умножить каждый столбец M
от N
слева просто выполните обычное умножение матрицы на матрицу:
M = N * M;
Это оценит N*M
во временный, который затем перемещается в M
,
Если вы делаете это много и хотите повторно использовать выделенную память для этого, объявите временную матрицу M_temp
где то раньше и пиши
M_temp.noalias() = N * M;
M.swap(M_temp); // M_temp has the old memory of M; Swapping is O(1)
Если вы боитесь слишком большого потребления памяти, вы можете написать что-то вроде
for(long i=0; i<M.cols()-3; i+=4)
M.middleCols<4>(i) = N * M.middleCols<4>(i);
M.rightCols(M.cols()%4) = N * M.rightCols(M.cols()%4);
Других решений пока нет …