在 r 中保存递归结果
Saving recursive results in 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
循环的思路是对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)
这段代码有点乱。提供所需的输出可能会有所帮助。这是因为,一般来说,您可以在操作矩阵时绕过慢速 for 循环。话虽这么说,这应该有所帮助
您的代码的第一个问题是您没有使用初始值。此外,您正在尝试对整数进行子集化,例如,当 v <- 10L
v[2]
将 return 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, ]
}
我对算法示例做了一些修改。 最后一个例子遗漏了一些信息。我正在更详细地解释。可能有一些基本问题,但我对循环不是很熟悉。
初始值
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)
这段代码有点乱。提供所需的输出可能会有所帮助。这是因为,一般来说,您可以在操作矩阵时绕过慢速 for 循环。话虽这么说,这应该有所帮助
您的代码的第一个问题是您没有使用初始值。此外,您正在尝试对整数进行子集化,例如,当 v <- 10L
v[2]
将 return 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, ]
}