Начните с вычисления D-U
во временный вектор, чтобы он оценивался только один раз, а затем, поскольку ваши векторы крошечные, попробуйте заменить *
на .lazyProduct(...)
.Точнее, в конечном итоге вы получите:
auto DU = (D-U).eval();
A.noalias() += s * (C + DU.lazyProduct(DU.transpose()));
Конечно, вы должны точно сопоставлять каждое изменение с включенной полной оптимизацией компилятора, чтобы убедиться, что они действительно эффективны и не производят непроизводительных результатов.
Наконец, если A
и C
симметричны, у вас может возникнуть желание обновить только одну половину A. Это будет иметь смысл для больших матриц (например,> 200x200), но, поскольку ваши матрицы довольно малы, это будет контрпродуктивноиз-за логической нагрузки и менее эффективной SIMD.