【问题标题】:Order of linear algebra operations in JuliaJulia中的线性代数运算顺序
【发布时间】:2017-07-07 11:44:18
【问题描述】:

如果我有一个命令y = A*B*x,其中AB 是大矩阵,xy 是向量,Julia 会执行y = ((A*B)*x) 还是y = (A*(B*x))

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

【问题讨论】:

标签: julia


【解决方案1】:

验证这种事情的最好方法是通过@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),因此您可以明确使用括号来减少分配。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2019-08-01
    • 2023-03-13
    • 2016-01-20
    相关资源
    最近更新 更多