为什么要使用“ clamp”,“ clamp。”和“ clamp!”?在朱莉娅?

zae*_*aen 1 julia

Julia有两种方法可以将变量限制在数字范围内clampclamp!。带有点符号,clamp.也可以用于相同的功能。

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

clamp.在数组上逐个元素地操作以将每个值限制为该间隔。它也适用于不在数组中的整数和浮点数。

clamp! 对整个数组进行运算以将每个值限制为间隔。

为什么要用三个功能来做同一件事?有什么理由使用clamp!clamp,何时clamp.将同时处理标量和数组?

Bog*_*ski 5

实际上,您有两个功能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)
Run Code Online (Sandbox Code Playgroud)

clamp!(x, lo, hi)
Run Code Online (Sandbox Code Playgroud)

如果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)引发错误。

  • 我会说这是多余的,应该使用Julia 1.0进行清理。但是,您可以想到模糊的代码在其中有所作为,但它们很少见,例如`clamp!(rand。(5),0.25,0.75)`起作用而`clamp。(rand。(5),0.25,0.75) 。。失败,您必须中断广播融合,例如,像`clamp。(identity(rand。(5)),0.25,0.75)这样。 (2认同)