【问题标题】:Why have "clamp", "clamp.", and "clamp!" in Julia?为什么有“clamp”、“clamp.”和“clamp!”在朱莉娅?
【发布时间】:2018-08-23 22:57:28
【问题描述】:

Julia 拥有two methods for limiting variables to ranges of numbersclampclamp!。使用点表示法,clamp. 也可以用于相同的功能。

clamp 将标量限制为由两个值定义的区间。

clamp. 对数组逐个元素进行操作,以将每个值限制在该区间内。它也适用于不在数组中的整数和浮点数。

clamp! 对整个数组进行操作以将每个值限制在区间内。

为什么要用三个函数来做同样的事情?当clamp. 将同时处理标量和数组时,是否有任何理由使用clamp!clamp

【问题讨论】:

  • 这是一个函数,.!是修饰符,它们适用于任何函数
  • 不完全。 ! 不是修饰符。它们表示改变其输入的函数。 . 是让我们的生活更轻松的广播运营商。所以你有 2 个函数:clampclamp!。第一个返回您的数组的副本,而第二个修改原始数组。如果您添加 .,那么您将按元素应用该函数。

标签: julia


【解决方案1】:

其实你有两个函数clampclamp!

函数clamp 只接受所有参数的标量。所以唯一被接受的用法是clamp(3, 4, 5)

函数clamp! 接受一个数组作为第一个参数,将标量作为第二个和第三个参数。它修改了它的第一个参数。

调用clamp.(x, lo, hi)是函数clamp的广播应用。

这意味着clamp.(x, 4, 5) 将创建一个新向量(大多数情况下 - 请参阅下面的注释了解例外情况),而clamp!(x, 4, 5) 将更新x 的内容。

你也可以写一些类似的东西,例如clamp.([1,2,3], [3,1,6], [4,5,7]) 并广播所有参数,这是 clamp! 不允许的。

最后,这两个表达式产生相同的结果:

x .= clamp.(x, lo, hi)

clamp!(x, lo, hi)

如果lohi 都是标量,因为它们都在原地修改x.= 赋值告诉 Julia 原地修改它)。

编辑:

clamp.clamp! 之间的一个更重要的区别(clamp! 就地的自然结果)是广播 clamp 适用于不可变参数,例如clamp.(0:0.1:1, 0.25, 0.75) 会起作用,而clamp!(0:0.1:1, 0.25, 0.75) 会抛出错误。

【讨论】:

  • 看来clamp! 是多余的,那么。有没有不能用clamp代替的情况?
  • 我会说它是多余的,应该用 Julia 1.0 清理它。但是,您可以想到一些晦涩难懂的代码,但它们很少见,例如clamp!(rand.(5), 0.25, 0.75)clamp.(rand.(5), 0.25, 0.75).fails 时有效,您必须中断广播融合,例如像这样clamp.(identity(rand.(5)), 0.25, 0.75)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2020-12-02
  • 2013-09-16
  • 2018-11-27
相关资源
最近更新 更多