将长向量中的元素裁剪为 +/- 阈值
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))
【讨论】:
以上是关于将长向量中的元素裁剪为 +/- 阈值的主要内容,如果未能解决你的问题,请参考以下文章