Собственные и ленивые вычисления

Я использую Eigen3 в своей программе для всего, что связано с матрицами. Я знаю, что Eigen использует ленивые вычисления для оптимизации всех вычислений. Я хотел бы знать, оптимизирована ли такая операция в смысле ограниченных ненужных вычислений:

D = (A*B*C)(0,0);

где A,B,C — матрицы, а D — скаляр. На английском мне нужен только один элемент матричного произведения.

Спасибо.


person user2460530    schedule 21.11.2015    source источник


Ответы (1)


Для всех операций с коэффициентами ответ положительный. Однако матричные продукты являются особенными, поскольку из соображений эффективности они по умолчанию оцениваются во временных объектах. Вы можете применить ленивую оценку матричного произведения, используя lazyProduct:

double ABij = A.lazyProduct(B)(i,j);

Для «тройного» продукта, такого как A*B*C, ситуация сложнее, потому что вложенный продукт будет оцениваться в любом случае (чтобы избежать многократной переоценки в общем случае), поэтому вы должны ограничить его самостоятельно, например:

 A.lazyProduct(B*C.col(j))(i);
person ggael    schedule 21.11.2015
comment
Спасибо, это именно то, что я искал. Насколько я понимаю, обобщение двух произведений N матриц сложно, не так ли? (мне это не нужно, просто из любопытства) - person user2460530; 22.11.2015