2016-03-03 247 views
2

爲什麼在使用C++特徵庫時需要使用noallias()表達式進行矩陣乘積運算?特徵矩陣乘法

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 

,因爲如果你開始計算你不能做同樣的nd替換A0,0 - 那麼您無法計算其他A0,j

因此默認情況下 - 在執行產品操作分配時,會創建一個臨時結構,並在隨後完成分配(請參見noalias)。

當您在作業的源項上使用noalias時,您「保證」所分配的變量不是產品條款的一部分,並且不使用臨時結構是安全的。

這是來自於Eigen在執行操作時是「懶惰」的事實(意味着它僅在必要時纔會執行,而不是像我們習慣於在標準C++中那樣執行) - 是告訴Eigen當進行產品操作並將其分配給變量時,這也是安全的。