Julia有two methods for limiting variables to ranges of numbers:clamp
和clamp!
。使用点符号时,clamp.
也可以用于相同的功能。
clamp
将标量限制为由两个值定义的间隔。
clamp.
在数组上逐个元素地操作以将每个值限制为该间隔。它也可以用于不在数组中的整数和浮点数。
clamp!
对整个数组进行操作,以将每个值限制为间隔。
为什么要使用三个功能来做同一件事?当clamp!
同时处理标量和数组时,是否有任何理由使用clamp
或clamp.
?
答案 0 :(得分:5)
实际上,您有两个功能clamp
和clamp!
。
函数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)
如果lo
和hi
是标量,因为它们都修改了x
(.=
分配告诉Julia对其进行了修改)。
编辑:
clamp.
和clamp!
之间的另一个重要区别(自然是clamp!
就位的结果)是广播clamp
的作用是不变的,例如clamp.(0:0.1:1, 0.25, 0.75)
将起作用,而clamp!(0:0.1:1, 0.25, 0.75)
将引发错误。