2016-04-25 8 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×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

2つのバグがあります。

まず、逆数をself.inverse = [[]]と定義します。それには要素がありません[0][0]、したがって例外です。逆行列をゼロ行列で初期化するには、代わりにself.inverse = [[0] * numColumns for i in range(numRows)]と書くことができます。

プログラムは、self.inverse = self.inverse * (1/(a*d - b*c))という行で失敗します。リストに数字を乗算する方法がPythonには分かりません。これを行うための 一つの方法は、b * (-1)は、単に-b書き込むことができ

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

お知らせもある可能性があります。

それ以外は、クラスはちょっと醜いですが、逆演算の答えは正しいです。通常、行列クラスはあらかじめ定義された定数行列で初期化されないため、逆行列はメンバーではなく別の行列になるので、私は醜いと言う。しかし、私はより良い、より完全なクラスを準備するためのテストしかないと思います。 "場所に" 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

2番目の部分は、逆行列の各要素にk倍を乗算するだけです。あれは正しいですか? – ARW

+0

@ARWはい、そうです。実際には、self.inverseの各要素にkを掛けた新しい行列(リストのリスト)を作成し、self.inverseを置き換えます。あなたはforループを使って "in place"を掛けることもできます。 – rto32

関連する問題