【问题标题】:What method did Julia use?朱莉娅用了什么方法?
【发布时间】:2016-05-09 09:30:05
【问题描述】:

我定义了以下变量

julia> X = (1:10) * ones(1,10)

它定义了一个矩阵,每行等于相同的数字,并且列中的数字从 1 增加到 10 增加 1。我想知道哪个方法使用 Julia 函数*。我怎么能问 Julia?

【问题讨论】:

  • 我知道@Daniel,只是我希望 Julia 告诉我我正在使用定义为 *(UnitRange{Int64}, Array{Float64,2}) 的方法
  • 我不太擅长解释输出,但@code_warntype (1:10) * ones(1,10) 可能会告诉您您需要知道的内容。据我所知(我强调这不是我所知道的),最终* 似乎在两个输入Array{Float64, 2} 上调用Base.LinAlg.generic_matmatmul!。希望有更多知识的人可以参与进来。

标签: methods julia multiple-dispatch


【解决方案1】:

@which 就是你要找的东西:

@which (1:10) * ones(1, 10)
# *(A::AbstractArray{T,1}, B::AbstractArray{T,2}) at linalg/matmul.jl:89

Jupyter 中,它还将超链接到相应的line of code,其中该方法在 Julia 的 GitHub 中定义。

【讨论】:

  • 有趣。有没有办法迭代地深入挖掘?即,您的答案中引用的行再次调用*,但在两个抽象矩阵上。有没有办法让@which 也告诉我们接下来调用哪个方法? (大概在这种情况下是* 两个Matrix{Float64}?)
  • @colin 我不知道,但我确信有一种元编程方式可以做到这一点。
  • @ColinTBowers 如果你有那行代码,你可以手动检查下一个-* by which(*, (Matrix{Float64},Matrix{Float64}))
  • 这种追踪噩梦是多次调度的缺点吗? :p
  • @GnimucK。 “which(*, (Matrix{Float64},Matrix{Float64}))”-> 是的,就是这样。正如 amrods 建议的那样,可能有一个简洁的小函数可以在这里编写来迭代链。感谢您的回复(你们俩)。
猜你喜欢
  • 2018-11-27
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2014-12-31
  • 2017-01-15
  • 2016-02-18
  • 2021-11-04
相关资源
最近更新 更多