在R中实现矩阵行列式

时间:2017-10-13 18:14:30

标签: r matrix determinants

我被要求实现使用拉普拉斯展开计算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

我的代码出了什么问题?

2 个答案:

答案 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)
}