Меня попросили реализовать функцию, которая вычисляет определитель 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)
}
}
где k в функции determinantRec(X,k)
указывает, в какой строке я хочу использовать расширение Лапласа.
Моя проблема в том, что когда я запускаю determinantRec(matrix(c(1,2,3,4),nrow = 2,ncol = 2),1)
появляется эта ошибка:
C stack usage 7970628 is too close to the limit
Что не так с моим кодом?
?browser
для некоторых вариантов. Ваш код, кажется, имеет проблемы с граничными условиями. Когдаk=1
, тоminor()
вызывается сi=1
, а1:(i-1)
- это1:0
, что, вероятно, не то, что вам нужно. - person MrFlick   schedule 13.10.2017minor
неправильно уменьшает размер матрицы, когдаi
илиj
равны 1 (из-за комментария @MrFlick выше). В результатеdeterminantRec
застревает в бесконечной рекурсии. - person Artem Sokolov   schedule 13.10.2017