在Julia中,@.是什么作用?

4
我正在尝试在Julia中使用LsqFit package,文档中使用了一个名为@.的宏,但并没有解释它是如何工作的。从软件包文档中无法确定这是否是标准的Julia宏,还是该软件包特有的内容,我也找不到其他地方关于此宏的参考资料。请问@.在Julia中是如何工作的?

1个回答

16

你可以通过按下 ? 进入帮助模式来查看任何 Julia 函数的文档,如下所示:

你可以通过按下 ? 进入帮助模式来查看任何 Julia 函数的文档,如下所示:

help?> @.
  @. expr

  Convert every function call or operator in expr into a "dot call" (e.g. convert f(x) to f.(x)), and convert
  every assignment in expr to a "dot assignment" (e.g. convert += to .+=).

  If you want to avoid adding dots for selected function calls in expr, splice those function calls in with $.
  For example, @. sqrt(abs($sort(x))) is equivalent to sqrt.(abs.(sort(x))) (no dot for sort).

简单来说,上面的文档描述了@.允许您将宏后面的表达式中的所有函数调用向量化。

如果您不确定任何Julia宏的工作方式,我建议使用@macroexpand宏,例如:

julia> @macroexpand @. [1, 2, 3] + [4, 5, 6]
:((+).([1, 2, 3], [4, 5, 6]))

在使用@.时,是否有可能避免点赋值?例如:@. a = b*c - Akahs
通常情况下,不需要将赋值向量化。如果右侧有一个向量,它会被分配给左侧。一个例外情况可能是类似于 A = zeros(4, 4); B = [1, 2, 3, 4]; A .= B 这样的情况,输入 ?.= 获取更多信息。 - Przemyslaw Szufel
问题在于,如果我只写@。a = b * c,我必须先声明'a',否则会出现varundefError。另一方面,如果我们可以避免使用@。而不使用.=,那么我就不需要这样做。 - Akahs
也许你的意思是 a = @. b*c ,此时 a 不需要声明。 - Przemyslaw Szufel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接