реконструкция функции из ее логического портрета (паттерна)
создадим некий вектор х
set.seed(1)
x <- cumsum(rnorm(10))
plot(x,t="b")
теперь создадим его логический паттерн. Что я имею ввиду, мы просто берем вектор х , выбираем из него две точки и сравниваем их между собой логическим условием (первая точка больше второй? ответ TRUE/FALSE) и так по две точки перебираем все возможные комбинации в х
для этого написал простую функцию to.logyc
to.logyc <- function(x){
cmb <- combn(length(x),2) # сзд. все комбинации индексов
logic.pattern <- rep(NA,ncol(cmb))
for(i in 1:ncol(cmb)){
i1 <- cmb[1,i]
i2 <- cmb[2,i]
logic.pattern[i] <- x[i1] > x[i2]
}
return(logic.pattern)
}
запустим функцию to.logyc на векторе Х
to.logyc(x)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[17] FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[33] FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE FALSE FALSE
на выходе получили логический вектор (логический паттерн) вектора Х
А теперь собственно сам вопрос как восстановить/реконструировать ветор Х по этому логическому паттерну, чтобы получить что то типа этого
rezult.pattern <- c(1,2,5,4,3,9,8,7,6,10)
plot(rezult.pattern,t="b")
можно сравнить, с логической точки зрение паттерны идентичны
orig.logyc <- to.logyc(x)
reconst.logyc <- to.logyc(rezult.pattern)
all( orig.logyc == reconst.logyc)
[1] TRUE
Ответы (1 шт):
для получения того, что вы хотите, надо сохранять не два состояния — «больше»/«не больше», а три — «меньше»/«равно»/«больше». а с тем, что у вас сейчас, можно получить максимум такой вектор: 0 0 2 1 0 3 2 1 0 0.
пример получения:
t <- to.logyc(x)
n <- function(x) (-1+sqrt(1+8*length(x)))/2+1
v <- rep(0, n(t))
e <- length(t)
for(i in (length(v)-1):1) {
for(j in (length(v)):(i+1)) {
if(t[e]) v[i]<-v[j]+1
e <- e - 1
}
}
v
[1] 0 0 2 1 0 3 2 1 0 0
p.s. чтобы получить ту же псевдослучайную последовательность, что и у автора вопроса, мне пришлось сменить алгоритм, используемый генератором псч:
RNGkind(kind = "L'Ecuyer-CMRG", normal.kind = "Inversion")
по умолчанию у меня было так (версия r — 3.5.2):
RNGkind(kind = "default", normal.kind = "default")
RNGkind()
[1] "Mersenne-Twister" "Inversion"
см. справку к функции RNGkind():
?RNGkind

