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