将长向量中的元素裁剪为 +/- 阈值

Posted

技术标签:

【中文标题】将长向量中的元素裁剪为 +/- 阈值【英文标题】:Clipping elements in a long vector to +/-threshold 【发布时间】:2015-01-10 21:15:12 【问题描述】:

我正在用 R 编写程序。我卡在这里。

我有类似的向量

X=c(84.05, 108.04, 13.95, -194.05, 64.03, 208.05, 84.13, 57.04)

我想在用 180 替换该向量中 >180 的所有元素后得到一个向量 以及小于

如我所愿,

X=c(84.05, 108.04, 13.95,-180, 64.03, 180, 84.13, 57.04)

如何做到这一点??

我正在处理的向量非常大。

【问题讨论】:

这个操作叫做clipping或者clamping 【参考方案1】:

尝试使用pmin

> pmin(abs(X), 180)*sign(X)
[1]   84.05  108.04   13.95 -180.00   64.03  180.00   84.13   57.04

基准测试

> Jilber <- function() pmin(abs(X), 180)*sign(X)
> MrFlick <- function() pmin(pmax(X, -180), 180)
> user1317221_G <- function() ifelse(X < -180,-180, ifelse(X > 180, 180, X))
> benchmark(replications=50000,
+           Jilber(),
+           MrFlick(),
+           user1317221_G(), 
+           columns=c('test', 'elapsed', 'relative'))
             test elapsed relative
1        Jilber()   0.835    1.000
2       MrFlick()   1.297    1.553
3 user1317221_G()   1.709    2.047

【讨论】:

我想我经常看到pmin(pmax(X, -180), 180)。你觉得这样更有效率吗? 工作得很好。感谢您的帮助。 @MrFlick,您的解决方案可能比我的更有效,我应该进行基准测试。顺便说一句,非常好。 我认为效率更高的原因是,在@Jilber 建议的第一个代码中使用了三个函数......而在 MrFlick 建议的代码中涉及两个函数。我是在思考正确还是遗漏了什么?谢谢。 @MrFlick 根据基准测试结果,您的替代方案比我的慢 63%。【参考方案2】:
ifelse(X < -180,-180, ifelse(X > 180, 180, X))

【讨论】:

以上是关于将长向量中的元素裁剪为 +/- 阈值的主要内容,如果未能解决你的问题,请参考以下文章

Java7/8中的HashMap和ConcurrentHashMap全解析

HashMap源码学习

Opencv中的阈值函数

检查灰度图像中的像素是不是为黑色(OpenCV)

将Matlab中的绘图保存为矩阵[重复]

python中的逻辑回归。概率阈值