реализовать определитель матрицы в R

Меня попросили реализовать функцию, которая вычисляет определитель 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

Что не так с моим кодом?


person Julia    schedule 13.10.2017    source источник
comment
Вы уже отлаживали код в R? Взгляните на ?browser для некоторых вариантов. Ваш код, кажется, имеет проблемы с граничными условиями. Когда k=1, то minor() вызывается с i=1, а 1:(i-1) - это 1:0, что, вероятно, не то, что вам нужно.   -  person MrFlick    schedule 13.10.2017
comment
Ваша функция minor неправильно уменьшает размер матрицы, когда i или j равны 1 (из-за комментария @MrFlick выше). В результате determinantRec застревает в бесконечной рекурсии.   -  person Artem Sokolov    schedule 13.10.2017
comment
Может быть полезен следующий вопрос: way" title="как более разумно удалить определенные строки и столбцы из матрицы"> stackoverflow.com/questions/12919984/   -  person Artem Sokolov    schedule 13.10.2017


Ответы (2)


@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)
}
person Mr_Rivers    schedule 13.09.2020

Спасибо @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)
}

Отладка с помощью browser() также была полезна :)

person Julia    schedule 15.10.2017