我想将以下递归函数的每个函数调用的输出保存到列表中。此外,我需要知道哪个(j,l)对对应于结果列表的哪个条目。
我创建了一个精简版本来重现问题。如果我应该提供更多信息来帮助解决问题,请告诉我。任何帮助都非常感谢。谢谢。
#the recursive function
phi <- function(phik,j,l,k,d) {
if(j==0) {
diag(d)
}
else{
if(j==1) {
if(l>k) {
0 * diag(d)
}
else{
phik[[l]]
}
}
else {
if(l>k) {
0 + phi(phik,j-1,l,k,d) %*% phik[[1]]
}
else {
phi(phik,j-1,l+1,k,d) + phi(phik,j-1,l,k,d) %*% phik[[1]]
}
}
}
}
#related stuff
set.seed(123456)
phik <- vector(mode="list", length=3)
phik[[1]] <- matrix(rnorm(n=16,mean=0,s=1),nrow=4)
phik[[2]] <- matrix(rnorm(n=16,mean=0,s=1),nrow=4)
phik[[3]] <- matrix(rnorm(n=16,mean=0,s=1),nrow=4)
d <- nrow(phik[[1]])
k <- length(phik)
#function call
phiout <- phi(phik,j=10,l=1,k=k,d=d)
答案 0 :(得分:1)
因此,使用递归函数有点棘手,因为如果你想要中间步骤的结果,你可以将它们粘合在一个列表中。当然,这意味着当您在函数中使用递归的结果时,您必须挖掘出您想要的值。这听起来有些令人费解,但在你的情况下,我只是说你必须在每一步都返回一个phi
,j
和l
的小清单,但只需退出{ {1}}进行乘法运算时。这是一个小例子:
phi
您可能会对我在第一到第三种情况下嵌套结果的原因感兴趣(当#the recursive function
phi <- function(phik,j,l,k,d) {
if(j==0)
list(list(phi=diag(d),j=j,l=l))
else{
if(j==1) {
if(l>k)
list(list(phi=0 * diag(d),j=j,l=l))
else
list(list(phi=phik[[l]],j=j,l=l))
}
else {
if(l>k) {
first<-phi(phik,j-1,l,k,d)
second<-list(list(phi=0 + first[[1]]$phi %*% phik[[1]], j=j,l=l))
c(second,first)
}
else {
first<-phi(phik,j-1,l+1,k,d)
second<-phi(phik,j-1,l,k,d)
third<-list(list(phi=first[[1]]$phi+(second[[1]]$phi %*% phik[[1]]), j=j, l=l))
c(third,first,second)
}
}
}
}
为0或1时)。如果你看一下其他案例,可能会很清楚。当j
(和l>k
不是0或1)时,会有两个调用j
。在这种情况下,会返回phi
,其中包含两组list
,phi
和i
,因此它必须是j
{ {1}}秒。当我想从返回的值中提取list
时,很难判断它是list
还是phi
list
,所以我只是将它们标准化为同样的东西。
我认为list
陈述是丑陋的,但其他人不同意。如果您愿意,可以添加它们,但它们是完全没必要的(在这种情况下)。
一些示例输出:
list