2016-03-03 4 views
2

Зачем нужно использовать выражение noallias() при работе с матричным продуктом при использовании собственной библиотеки C++?Умножение собственных матриц

m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate() 

Я читал некоторые заметки об этом, но все еще трудно понять.

ответ

4

когда вы делаете сумму, как:

A=A+B 

Эйгена можно непосредственно использовать переменную A, чтобы выполнить операцию, так как каждая ячейка матрицы может быть вычислена без ущерба для расчета других клеток Ai,j=Ai,j+Bi,j

когда вы делаете продукт, как:

A=A*B 

вы не можете сделать то же самое, так как если вы начнете рассчет й заменить A0,0 - то вы не можете вычислить другой A0,j

так по умолчанию - при выполнении присваивания работы продукта, временная структура создаются и назначение сделано позже (см noalias).

Когда вы используете noalias в терминах источника задания, вы «гарантируете», что назначенная переменная не является частью условий продукта и что безопасно не использовать временную структуру.

Это происходит из-за того, что Eigen «ленится» при выполнении операций (что означает, что он делает это только тогда, когда это необходимо, а не мгновенно, как мы привыкли в стандартном C++) - noalias - это способ сказать Eigen что это также безопасно делать при выполнении операции с продуктом и присвоении его переменной.

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