2016-09-19 2 views
0

Я делаю некоторые изменения в примере algoritm. В последнем примере пропущена некоторая информация. Я объясняю более подробно. Возможно, есть некоторые основные проблемы, но я не очень хорошо знаком с циклами.Сохранение рекурсивных результатов в r

Начальные значения

x<-matrix(c(1,1,1,1, 
     -1,-1,1,1, 
     -1,1,-1,1), nrow = 4) 
w<-matrix(rep(0,15), nrow = 5) 
d<-c(-1,1,1,1) 

Переменные

v <- 10L 
y <- 10L 
e <- 10L 
des <- 10L 
m <- 0.5 

Идея данного цикла является, чтобы найти значения ш для каждой строки х до тех пор, г = я. Более ясно, если вы видите цикл.

Этот цикл работает хорошо, но только для первых 5 рядов. Он должен зацикливаться на x до тех пор, пока не будет выполнено условие (d = i). Я знаю, что это не правильный способ. Это просто пример того, что я хочу делать. Другие варианты (применяются) приветствуются.

Loop

for(i in 1:4) { 
# Multiplies every row of x by w. The w comes from the result of the loop.  
v[i]<- t(w[i,]) %*% x[i,] 

# Takes the sign of v. 
y[i] <- if(v[i] >= 0) 1 else -1 

# Value to use in the last line of the loop. 
e[i] <- d[i]-y[i] 

des[i] <- if(d[i] == y[i]) 1 else 0 #check if condition is satisfied 
w[i+1,] <- w[i,]+(m*e[i]*x[i,]) 
} 

Желаемая выход

w <- matrix(c(0,-1,0,1,1,1,1, 
    0,1,0,1,1,1,1, 
    0,1,2,1,1,1,1), nrow=7) 
+0

Код не воспроизводится и выдает ошибку 'Error in des [i] <- if (d [i] == y [i]) 1 else 0: object 'des' not found'. Предоставьте воспроизводимый код. –

+0

Я бы включил ваш цикл в функцию, чтобы вы передали w в качестве параметра. Затем вы можете вернуть все, что захотите, в результате вызова этой функции, включая новый w - без перезаписи оригинала w. Я не понимаю, что вам нужно. – Joy

+0

@Alfredo_MF, что такое 'd'? –

ответ

0

Этот код немного грязный. Было бы полезно предоставить желаемый результат. Это потому, что, вообще говоря, вы можете обходить медленные циклы при манипулировании матрицами. При этом это должно помочь

Первая проблема с вашим кодом заключается в том, что вы не используете свои начальные значения. Кроме того, вы пытаетесь подмножество целых чисел, например, когда v <- 10Lv[2] вернет NA. Ниже я предварительно выделил все параметры, которые вы позже используете.

itr_n <- 3 
v <- rep(NA, itr_n) 
y <- rep(NA, itr_n) 
e <- rep(NA, itr_n) 
des <- rep(NA, itr_n) 
res <- matrix(rep(NA, itr_n*itr_n), itr_n, itr_n) # this is a result matric to store 
res[i, ] <- w #populating the row with info before we change w 


for(i in 1:itr_n){ 
    v[i]<- w %*% x[i,] #w[i,] was redundent since w is already a column vector 
    y[i] <- if(v[i] >= 0) 1 else -1 
    e[i] <- d[i] - y[i] 
    des[i] <- if(d[i] == y[i]) 1 else 0 
    res[i+1, ] <- w + (m*e[i]*x[i,]) #storing w in a res matrix 
    w <- res[i+1, ] 
} 
+0

Посмотрите на изменения, которые я только что сделал для алгоритма с желаемым выходом. Произведение 'v [i] <- w% *% x [i,]', которое вы предлагаете, неверно. Результат должен быть декартовым матричным произведением (1x1). –