Julia中的线性代数运算顺序

时间:2017-07-07 03:00:47

标签: julia

如果我有一个y = A*B*x A&{ B是大型矩阵,x& y是向量,Julia会预先y = ((A*B)*x)还是y = (A*(B*x))

第二个选项应该是最好的,因为它只需要分配一个额外的向量而不是一个大的矩阵。

1 个答案:

答案 0 :(得分: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))

与许多其他语言一样,Julia会y = (A*B)*x代替y = A*(B*x),所以您可以明确使用parens来减少分配。

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)