2017-03-07 5 views
3

私はAW形状(y=f(x))に0と1の間の値(x)を投影する必要があります。xを0と1の間にw字型に投影する、よりエレガントな方法はありますか?

enter image description here

私は次の関数で必要なものを達成することができます:

f <- function(x) { 
    if (x < 0.25) { 
    return (1-4*x) 
    } 
    if (x < 0.50) { 
    return (-1 + 4*x) 
    } 
    if (x < 0.75) { 
    return (3 - 4*x) 
    } 
    return (-3 + 4*x) 
} 


x <- 0:20/20 
y <- lapply(x, f) 

plot(x, y) 
lines(x,y, col='red') 

しかし、私は、より洗練された解決策、おそらく1つのライナーが私の問題にあると信じる傾向があります。

Rにはこのようなものがありますか?

答えて

6
f <- function(x) 
abs(abs(2 - 4 * x) - 1) 

plot(f) 

enter image description here

1

ここにベクター化された解決策があります。

f2 <- function(x) { 
    y <- 1 - 4 * x 
    y[0.25 <= x & x < 0.50] <- -1 + 4 * x[0.25 <= x & x < 0.50] 
    y[0.50 <= x & x < 0.75] <- 3 - 4 * x[0.50 <= x & x < 0.75] 
    y[0.75 <= x]    <- -3 + 4 * x[0.75 <= x] 
    return(y) 
} 

これは、それが

x <- seq(0, 1, length = 1001) 
library(microbenchmark) 
microbenchmark(
    original = {y1 <- sapply(x, f)}, 
    vectorised = {y2 <- f2(x)} 
) 
all.equal(y1, y2) 

タイミング

Unit: microseconds 
     expr  min  lq  mean median  uq  max neval cld 
    original 1170.487 1198.0590 1500.39726 1534.2840 1566.953 8317.288 100 b 
vectorised 51.767 55.2405 58.65856 56.9055 58.981 107.117 100 a 
1
f=function(x){ 
     f_x = 4*pmin(abs(x-0.25),abs(x-0.75)) 
     return(f_x) 
    } 
はるかに高速であるという利点を持っています0

enter image description here

+2

「pmin」は、「min」のベクトル化された形式です。両方を試して、彼らが何をするかを見てください。 –

+0

これは良いです。ありがとう@HongOoi –

関連する問題