【发布时间】:2021-05-29 22:05:42
【问题描述】:
让len = 3 表示序列的长度。如何编写一个接收len 并输出1 和-1 交替序列的函数?
对于示例,对于 len = 3,我希望函数返回 1 -1 1。如果len = 5,则1 -1 1 -1 1,以此类推。
【问题讨论】:
标签: r
让len = 3 表示序列的长度。如何编写一个接收len 并输出1 和-1 交替序列的函数?
对于示例,对于 len = 3,我希望函数返回 1 -1 1。如果len = 5,则1 -1 1 -1 1,以此类推。
【问题讨论】:
标签: r
您可以尝试rep 选项length.out
> rep(c(1, -1), length.out = 5)
[1] 1 -1 1 -1 1
或replace
> replace(rep(1, 5), !(seq(5) %% 2), -1)
[1] 1 -1 1 -1 1
或%%
> 2 * seq(5) %% 2 - 1
[1] 1 -1 1 -1 1
【讨论】:
一个选项是
f1 <- function(len) {
s1 <- seq_len(len)
c(-1, 1)[(s1 %%2 == 1)+1]
}
f1(3)
#[1] 1 -1 1
f1(5)
#[1] 1 -1 1 -1 1
【讨论】:
2*(s1 %%2)-1?这样你就不需要索引任何东西了。
模 %% 和 ifelse 也是一种可能性:
n <- 10
ifelse((1:n)%%2,1,-1)
# [1] 1 -1 1 -1 1 -1 1 -1 1 -1
但是效率不高:
microbenchmark::microbenchmark(
rep(c(1, -1), length.out = n),
c(-1, 1)[((1:n)%%2 == 1)+1],
ifelse((1:n)%%2,1,-1))
Unit: nanoseconds
expr min lq mean median uq max neval
rep(c(1, -1), length.out = n) 300 400 531 500 500 4100 100
c(-1, 1)[((1:n)%%2 == 1) + 1] 1100 1200 1507 1300 1400 16700 100
ifelse((1:n)%%2, 1, -1) 4100 4350 5053 4700 4950 37200 100
【讨论】:
n > 1 的选项可以是:
rep(1, 3) * c(1, -1)
[1] 1 -1 1
【讨论】:
很简单:
f <- function(num,len){
num*(-1)**(0:len)
}
> f(1,5)
[1] 1 -1 1 -1 1 -1
> f(3,5)
[1] 3 -3 3 -3 3 -3
> f(-1,5)
[1] -1 1 -1 1 -1 1
这是非常有效的,同时它作为一个数字函数是有意义的。但是,效率最高的一个数量级是rep 方法,特别是当n 变大时。
> n <- 10000
> microbenchmark::microbenchmark(
+ rep(c(1, -1), length.out = n),
+ c(-1, 1)[((1:n)%%2 == 1)+1],
+ ifelse((1:n)%%2,1,-1),
+ (-1)**(0:n)
+ )
Unit: microseconds
expr min lq mean median uq max neval
rep(c(1, -1), length.out = n) 14.358 14.8565 15.16934 15.1425 15.3390 18.651 100
c(-1, 1)[((1:n)%%2 == 1) + 1] 238.995 240.0120 242.85757 240.7370 241.5830 312.495 100
ifelse((1:n)%%2, 1, -1) 311.653 314.0150 422.23417 315.2280 317.3465 5341.466 100
(-1)^(0:n) 211.948 212.6665 215.50381 213.2490 213.6770 339.639 100
【讨论】: