2017-07-07 31 views
4

線性代數運算的如果我有一個命令y = A*B*x其中A & B是大矩陣和x & y是矢量,將朱瓶坯y = ((A*B)*x)y = (A*(B*x))訂單在朱

第二個選項應該是最好的,因爲它只需要分配一個額外的矢量而不是一個大的矩陣。

+2

如果這對你是一個普遍的問題,那麼也許這個包:https://github.com/AustinPrivett/MatrixChainMultiply.jl能有所幫助。假設它根據矩陣維度選擇最佳乘法次序。 – DNF

回答

4

,以驗證這種事情最好的辦法是通過@code_lowered宏轉儲降低代碼:

julia> @code_lowered A * B * x 
CodeInfo(:(begin 
     nothing 
     return (Core._apply)(Base.afoldl, (Core.tuple)(Base.*, (a * b) * c), xs) 
    end)) 

像許多其他語言,朱莉婭確實y = (A*B)*x代替y = A*(B*x),所以它是由你來明確使用減少分配。

julia> using BenchmarkTools 

julia> @btime $A * ($B * $x); 
    6.800 μs (2 allocations: 1.75 KiB) 

julia> @btime $A * $B * $x; 
    45.453 μs (3 allocations: 79.08 KiB)