在r中保存递归结果

时间:2016-09-19 17:53:08

标签: r loops recursion apply

我对算法示例进行了一些更改。 最后一个例子错过了一些信息。我正在详细解释。可能存在一些基本问题,但我对循环不是很熟悉。

初始值

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

循环的想法是为x的每一行找到w的值,直到d = i。如果你看到循环就更清楚了。

此循环运行良好,但仅适用于前5行。它必须在x上循环,直到满足条件(d = i)。 我知道这不是正确的做法。这只是为了举例说明我想做的事情。欢迎其他选项(申请)。

循环

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)

1 个答案:

答案 0 :(得分:0)

这段代码有点乱。提供所需的输出可能会有所帮助。这是因为,一般来说,在操作矩阵时,可以绕过缓慢的for循环。话虽如此,这应该有帮助

您的代码的第一个问题是您没有使用初始值。此外,您尝试对整数进行子集化,例如,v <- 10L v[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, ] 
}