2016-04-25 165 views
1
class multiDimensionalArray: 

def __init__(self, numRows, numColumns): 
    self.R = numRows 
    self.C = numColumns 

    self.array = [[(x+3*y) for x in range(self.R)] for y in range(self.C)]   

    self.inverse = [[]] 

def modifyItem(self, row, column, item): 
    self.array[row][column] = item 

def getItem(self, row, column): 
    print self.array[row][column] 
    return self.array[row][column] 

def showArray(self): 
    print self.array 

def changeSize(self, rows, columns): 
    self.R = rows 
    self.C = columns 
    self.array = [[(x+3*y) for x in range(self.R)] for y in range(self.C)] 

def getSize(self): 
    print [self.R, self.C] 
    return [self.R, self.C] 

def getInverse(self): 

    if ((self.R == 2) and (self.C == 2)): 
     a = self.array[0][0] 
     b = self.array[0][1] 
     c = self.array[1][0] 
     d = self.array[1][1] 

     for L in self.array: 
      for item in L: 
       item = int(item) 

     self.inverse[0][0] = d 
     self.inverse[0][1] = b * (-1) 
     self.inverse[1][0] = c * (-1) 
     self.inverse[1][1] = a 

     self.inverse = self.inverse * (1/(a*d - b*c)) 
     print self.inverse 
     return self.inverse 


mat = multiDimensionalArray(2,2) 
mat.showArray() 
mat.getInverse() 

此代碼卡在以下代碼行中。錯誤說「列表分配索引超出範圍」。我的目標是讓它做給定2x2矩陣的數學逆。 任何人都可以幫我搞定它嗎?謝謝創建2 x 2矩陣並查找其逆矩陣

self.inverse[0][0] = d 
self.inverse[0][1] = b * (-1) 
self.inverse[1][0] = c * (-1) 
self.inverse[1][1] = a 
+0

你意識到numpy?在那裏你可以做'imat = numpy.linalg.inv(mat)'。或者,也許這是學習練習?即使作爲一種學習練習,您也可以利用簡單的語法將數組乘以一個常量,例如'inv = inv /(a * db * c)'和一個multidim構造函數,例如'inv = numpy.zeros ((2,2))'。 – tom10

回答

1

有兩個錯誤。

首先,定義逆爲self.inverse = [[]]。它沒有元素[0][0],因此是一個例外。你可以寫self.inverse = [[0] * numColumns for i in range(numRows)]來用零矩陣初始化反函數。

程序將無法再上線self.inverse = self.inverse * (1/(a*d - b*c)):Python不知道如何通過一個數乘以一個列表。 一種方式做,這可能是

k = 1/(a*d - b*c) 
self.inverse = [[x * k for x in u] for u in self.inverse] 

還要注意b * (-1)可以簡單地寫-b

除此之外,該類是醜了一點,但答案計算逆是正確的。我說難看,因爲通常一個矩陣類不會用預定義的常量矩陣進行初始化,而反過來是另一個矩陣,而不是成員。但我想只有測試來準備更好更完整的課程。


要乘 「到位」 self.inverse的元素(即沒有建立一個新的矩陣):

for i in range(numRows): 
    for j in range(numColumns): 
     self.inverse[i][j] *= k 

你也可以這樣做:

for row in self.inverse: 
    for j in range(numColumns): 
     row[j] *= k 
+0

關於定義self.inverse的第一部分,我理解你的答案。 – ARW

+0

第二部分,您只需乘以k次逆矩陣中的每個元素即可。那是對的嗎? – ARW

+0

@ARW是的,沒錯。實際上,這會建立一個新的矩陣(列表清單),其中每個自我逆元素乘以k,它將取代self.inverse。你也可以用「for place」和for循環相乘,我在答案中加了一些代碼來告訴你如何。 – rto32