我想将一个值钳位x
到一个范围[a, b]
:
x = (x < a) ? a : ((x > b) ? b : x);
Run Code Online (Sandbox Code Playgroud)
这是非常基本的.但是我没有在类库中看到函数"clamp" - 至少在类库中没有System.Math
.
(因为不知道"钳制"一个值是为了确保它位于某些最大值和最小值之间.如果它大于最大值,则它被最大值替换,等等.)
我有以下代码:
new_index = index + offset
if new_index < 0:
new_index = 0
if new_index >= len(mylist):
new_index = len(mylist) - 1
return mylist[new_index]
Run Code Online (Sandbox Code Playgroud)
基本上,我计算一个新索引并使用它来从列表中查找一些元素.为了确保索引在列表的边界内,我需要将这两个if
语句写成4行.那是相当冗长,有点难看......我敢说,这是非常不科幻的.
还有其他更简单,更紧凑的解决方案吗?(和更多pythonic)
是的,我知道我可以if else
在一行中使用,但它不可读:
new_index = 0 if new_index < 0 else len(mylist) - 1 if new_index >= len(mylist) else new_index
Run Code Online (Sandbox Code Playgroud)
我也知道我可以链max()
和min()
在一起.它更紧凑,但我觉得它有点模糊,如果我输错了就更难找到错误.换句话说,我觉得这很简单.
new_index = max(0, min(new_index, len(mylist)-1))
Run Code Online (Sandbox Code Playgroud) Uint8Array
和Uint8ClampedArray
JavaScript有什么区别?据我所知,Uint8ClampedArray
它与画布一起用于像素操作.为什么这样做有什么好处?
假设我有一个value
,我通常会这样做"钳制"它到一个范围,这里是范围[0..1]
.也就是说,如果它低于范围开始,则将其增加到范围开始,将其增加到范围结束,将其减小到范围结束.
clampedValue = Math.max(0, Math.min(1, value));
Run Code Online (Sandbox Code Playgroud)
是否有内置功能可以夹紧到一个范围内?
是否有一种比使用if语句或三元运算符更有效的方法来钳制实数?我想为双打和32位修复点实现(16.16)做到这一点.我不是要求代码可以处理这两种情况; 它们将在不同的功能中处理.
显然,我可以这样做:
double clampedA;
double a = calculate();
clampedA = a > MY_MAX ? MY_MAX : a;
clampedA = a < MY_MIN ? MY_MIN : a;
Run Code Online (Sandbox Code Playgroud)
要么
double a = calculate();
double clampedA = a;
if(clampedA > MY_MAX)
clampedA = MY_MAX;
else if(clampedA < MY_MIN)
clampedA = MY_MIN;
Run Code Online (Sandbox Code Playgroud)
fixpoint版本将使用函数/宏进行比较.
这是在代码的性能关键部分完成的,所以我正在寻找一种尽可能有效的方法(我怀疑它会涉及位操作)
编辑:它必须是标准/便携式C,平台特定的功能在这里没有任何兴趣.此外,MY_MIN
和MY_MAX
我想要钳制的值相同(在上面的例子中加倍).
我写了以下代码,它保持x
在范围内(a..b)
.在伪代码中:
(if x < a, x = a; if x > b, x = b)
Run Code Online (Sandbox Code Playgroud)
在Ruby中它将是这样的:
x = [a, [x, b].min].max
Run Code Online (Sandbox Code Playgroud)
由于它是非常基本和有用的功能,我想知道是否有一个本机方法在ruby中这样做.
从Ruby 2.3.3开始,显然没有这样的方法,最短/更易读的方法是什么?
我发现:
x = [a, x, b].sort[1]
Run Code Online (Sandbox Code Playgroud)
到目前为止,但我不确定它是否更具可读性.
我想从列表中替换outliners.因此我定义了上限和下限.现在,上面upper_bound
和下面的每个值lower_bound
都被绑定值替换.我的方法是使用numpy数组分两步完成.
现在我想知道是否可以一步完成,因为我猜它可以提高性能和可读性.
有没有更短的方法来做到这一点?
import numpy as np
lowerBound, upperBound = 3, 7
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[arr > upperBound] = upperBound
arr[arr < lowerBound] = lowerBound
# [3 3 3 3 4 5 6 7 7 7]
print(arr)
Run Code Online (Sandbox Code Playgroud) 在Mathematica中有一个命令Clip[x, {min, max}]
,它给出了x
for min<=x<=max
,min
for x<min
和max
for x>max
,以及
http://reference.wolfram.com/mathematica/ref/Clip.html (镜像)
在R中实现这一目标的最快方法是什么?理想情况下,它应该是一个可列表的函数,理想情况下应该可以处理单个值,向量,矩阵或数据帧......
汤姆,欢呼声
我写了一个函数来"钳制"PHP中的数字,但我想知道这个函数是否存在于本地语言中.
我在数学部分阅读了PHP.net文档,但我找不到它.
基本上我的函数所做的是它接受一个变量,一个可能值的数组和一个默认值,这是我函数的签名:
function clamp_number($value, $possible_values, $default_value)
如果$value
不匹配$possible_values
则默认为$default_value
我认为如果PHP本身提供它,我的功能会更快,因为我在我的程序中经常使用它.
无论如何,如果这个问题不属于SO,请随时投票关闭它.