2015-12-29 42 views
1

的在下面的代碼:的R - 在如果誤差(nrow(M)== 2){:參數是長度爲零

det<-function(M) 
{ 
    if (nrow(M) == 2) 
    { 
     return(M[1,1]*M[2,2]-M[1,2]*M[2,1]) 
    } 
    else 
    { 
     d<-0 
     for (i in 1:ncol(M)) 
     { 
     d<-d+(-1)^(i+1)*M[1][i]*det(M[-1,i]) 
     } 
     return(d) 
    } 
} 

執行我確定

x<-matrix(c(1:9),nrow=3) 

時執行該功能功能

det(x) 

我得到錯誤:

Error in if (nrow(M) == 2) { : argument is of length zero

+1

的'det'功能已經存在在'R'中,並且正是你正在做的事情。 – nicola

回答

6

您使用的是遞歸函數,問題是在下面的行:

d<-d+(-1)^(i+1)*M[1][i]*det(M[-1,i]) 

在這裏,您正在使用M[-1, i]於子集的矩陣和R是你的矩陣轉換爲數字矢量(R總是轉換成子集化時最簡單的數據類型)。您可以設置參數drop=FALSE以避免這種情況。有關詳細信息,請參閱?"["?drop

x <- matrix(1:9, nrow=3) 
x[-1, 1] 
# [1] 2 3 
x[-1, 1, drop=FALSE] 
#  [,1] 
# [1,] 2 
# [2,] 3 

(請注意,當你解決這個問題。在你的if語句訪問第二個列,但M[-1, i]永遠只有一個列。您的功能甚至無法)

+1

或者只是使用'NROW'而不是'nrow'。 –

+0

感謝解決方案:) –

相關問題