2017-02-04 42 views
0
def rm_l_c(n,c,a,AC):   #function to remove line and column 
    for i in range(0,n-1): #row loop 
     for j in range(0,n-1): #colum 
      k = j+1 
      if (j<c):k=j; #the first element in index 0,0 
      AC[i][j]=a[i+1][k] #The error is here 


a=[[1,2,3],[4,5,6],[7,8,9]] 
detA=0 
AC=[] 

def det(a,n): 
    if(n==2): 
      detA=a[0][0]*a[1][1]-a[0][1]*a[1][0] 

    else: 
      for c in range(0,n): 
       rm_l_c(n,c,a,AC) 
       n = n-1 
       detA=detA+((-1)**c)*a[0][c]*det(AC,n) 
return detA 

det(a,3) 

這個代碼是使用拉普拉斯展開行列式的實施值插入到多維列表

https://en.wikipedia.org/wiki/Laplace_expansion

問題是在AC[i][j]=a[i+1][k] 我不知道如何做到這一點插入

也當我試圖運行它給了這個錯誤

Traceback (most recent call last): 
    File "C:\Users\zerocool\Desktop\det.py", line 22, in <module> 
    det(a,3) 
    File "C:\Users\zerocool\Desktop\det.py", line 17, in det 
    rm_l_c(n,c,a,AC) 
    File "C:\Users\zerocool\Desktop\det.py", line 6, in rm_l_c 
    AC[i][j]=a[i+1][k] 
IndexError: list index out of range 
>>> 
+3

'AC'是一個空列表。這是問題。一個快速解決方法是使AC每次都在變化,例如如果A是4x4,那麼AC = [[0,0,0],[0,0,0],[0,0,0]]' –

+1

AC將首次使用3x3,然後再次使用2x2,然後停止 – robert

+1

那麼,那就這樣做。 –

回答

0

正如juanpa.arrivillaga所述,您不能將元素插入到空列表中。 因爲您只是在rm_l_c中修改AC,所以您可以通過執行以下操作在每次運行帶有空元素(或任何其他您想要默認設置的元素)的正確大小的rm_l_c時創建它。

def rm_l_c(c,a):   #function to remove line and column 
    n = len(a) 
    AC = [[None]*(n-1) for i in range(n-1)] 
    for i in range(0,n-1): #row loop 
     for j in range(0,n-1): #column 
      k = j+1 
      if (j<c):k=j; #the first element in index 0,0 
      AC[i][j]=a[i+1][k] #Insert now happens correctly 
    return AC 

你可以通過交替使用列表理解,這是更Python和更易於閱讀獲得相同的最終結果爲rm_l_c。

def rm_l_c(c,a): 
    return [b[:c]+b[c+1:] for b in a[1:]]