4
線性代數運算的如果我有一個命令y = A*B*x
其中A
& B
是大矩陣和x
& y
是矢量,將朱瓶坯y = ((A*B)*x)
或y = (A*(B*x))
?訂單在朱
第二個選項應該是最好的,因爲它只需要分配一個額外的矢量而不是一個大的矩陣。
線性代數運算的如果我有一個命令y = A*B*x
其中A
& B
是大矩陣和x
& y
是矢量,將朱瓶坯y = ((A*B)*x)
或y = (A*(B*x))
?訂單在朱
第二個選項應該是最好的,因爲它只需要分配一個額外的矢量而不是一個大的矩陣。
,以驗證這種事情最好的辦法是通過@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)
如果這對你是一個普遍的問題,那麼也許這個包:https://github.com/AustinPrivett/MatrixChainMultiply.jl能有所幫助。假設它根據矩陣維度選擇最佳乘法次序。 – DNF