我被要求实现使用拉普拉斯展开计算n维矩阵行列式的函数。这涉及递归。我开发了这个:
minor<-function(A,i,j) {
return(A[c(1:(i-1),(i+1):dim(A)[1]),c(1:(j-1),(j+1):dim(A)[2])])
}
determinantRec<-function(X,k) {
if (dim(X)[1] == 1 && dim(X)[2] == 1) return(X[1][1])
else {
s = 0
for (i in 1:dim(X)[2]) {
s = s + X[k][i]*(-1)^(k+i)*determinantRec(minor(X,k,i),k)
}
return(s)
}
}
其中determinantRec(X,k)
函数中的k表示我想沿着拉普拉斯扩展使用哪一行。
我的问题是当我运行determinantRec(matrix(c(1,2,3,4),nrow = 2,ncol = 2),1)
时出现此错误:
C stack usage 7970628 is too close to the limit
我的代码出了什么问题?
答案 0 :(得分:0)
感谢@ArtemSokolov和@MrFlick指出问题的原因,就是这样。我还发现这段代码不能正确计算2x2矩阵的行列式。毕竟它看起来像那样:
determinantRek<-function(X,k) {
if (dim(X)[1] == 1 && dim(X)[2] == 1)
return(X[1,1])
if (dim(X)[1] == 2 && dim(X)[2] == 2)
return(X[1,1]*X[2,2]-X[1,2]*X[2,1])
else
s = 0
for (i in 1:dim(X)[2]) {
s = s + X[k,i]*(-1)^(k+i)*
determinantRek(X[-k,-i],k)
}
return(s)
}
使用浏览器()进行支持也很有用:)
答案 1 :(得分:0)
@julia,您的代码中只有一种简单的类型。只需删除“ s”定义末尾的“ *”即可。而且不要缩进递归。
determinantRek<-function(X,k) {
if (dim(X)[1] == 1 && dim(X)[2] == 1)
return(X[1,1])
if (dim(X)[1] == 2 && dim(X)[2] == 2)
return(X[1,1]*X[2,2]-X[1,2]*X[2,1])
else
s = 0
for (i in 1:dim(X)[2]) {
s = s + X[k,i]*(-1)^(k+i)
determinantRek(X[-k,-i],k)
}
return(s)
}