2
爲什麼在使用C++特徵庫時需要使用noallias()表達式進行矩陣乘積運算?特徵矩陣乘法
m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate()
我一直在閱讀關於它的一些筆記,但仍然覺得很難理解。
爲什麼在使用C++特徵庫時需要使用noallias()表達式進行矩陣乘積運算?特徵矩陣乘法
m1.noalias() += (s1*s2*conj(s3)*s4) * m2.adjoint() * m3.conjugate()
我一直在閱讀關於它的一些筆記,但仍然覺得很難理解。
當你正在做類似的總和:
A=A+B
本徵可以直接使用變量A來執行該操作,因爲,該矩陣的每個單元可以在不影響其它細胞的計算來計算Ai,j=Ai,j+Bi,j
當你正在做一個產品,如:
A=A*B
,因爲如果你開始計算你不能做同樣的nd替換A0,0
- 那麼您無法計算其他A0,j
因此默認情況下 - 在執行產品操作分配時,會創建一個臨時結構,並在隨後完成分配(請參見noalias)。
當您在作業的源項上使用noalias
時,您「保證」所分配的變量不是產品條款的一部分,並且不使用臨時結構是安全的。
這是來自於Eigen在執行操作時是「懶惰」的事實(意味着它僅在必要時纔會執行,而不是像我們習慣於在標準C++中那樣執行) - 是告訴Eigen當進行產品操作並將其分配給變量時,這也是安全的。