2
class Matrix:
  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return repr(self.data)  

  def __add__(self, other):
    data = []

    for j in range(len(self.data)):
        for k in range(len(self.data[0])):
            data.append([self.data[k] + other.data[k]])
        data.append([self.data[j] + other.data[j]])
        data = []

    return Matrix(data)  

x = Matrix([[1,2,3],[2,3,4]])
y = Matrix([[10,10,10],[10,10,10]])
print(x + y,x + x + y)

1行×n列のマトリックスを追加することができましたが、2番目のループを追加してすべてのn×nマトリックスを改善しようとすると、このエラーが発生しました。

Traceback (most recent call last):

  line 24, in <module>
    print(x + y,x + x + y)

  line 15, in __add__
    data.append([self.data[k] + other.data[k]])

IndexError: list index out of range
4

2 に答える 2

1

これはどう:

class Matrix:
  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return repr(self.data)  

  def __add__(self, other):
    data = []

    for j in range(len(self.data)):
        data.append([])
        for k in range(len(self.data[0])):
            data[j].append(self.data[j][k] + other.data[j][k])

    return Matrix(data)
于 2011-03-16T18:00:39.920 に答える
0

あなたのコードにはいくつかの問題があります...最初は加算アルゴリズムの基本的なロジックです

data.append([self.data[k] + other.data[k]])

このステートメントは非常に疑わしいです...データは2次元マトリックスですが、ここでは単一のインデックスでアクセスしています。data[k]したがって、行全体であり、使用+すると行が連結されます (おそらく、あなたが望んでいたものではないでしょう?)。おそらく、の解決策highBandWidthはあなたが探していたものです。

2 番目の問題はより微妙で、ステートメントに関するものです。

self.data = data

Python はいわゆる「参照セマンティック」を使用するため、これは問題になる可能性があります。マトリックスはdataコンテンツに渡されたパラメーターを使用しますが、コピーはしません。dataコンストラクターに渡した同じリスト オブジェクトへの参照が格納されます。これは意図的かもしれませんが、そうではないかもしれません... これは明確ではありません。同じデータから 2 つの行列を作成し、最初の要素の内容を変更すると、2 番目の要素の内容も変更されても問題ありませんか? そうでない場合は、要素をコピーする必要があります。たとえばdata、メンバーを割り当てるだけではありません。data

self.data = [row[:] for row in data]

または標準コピーモジュールcopy.deepcopyから使用します。

3 つ目の問題は、インデントに 2 つのスペースしか使用していないことです。これは賢明ではありません... Pythonで作業するときは、インデントに4つのスペースを使用し、ハードタブ文字を使用しないでください。これを(2つのスペースを使用して)行うことは賢くないと言ったことに注意してください。あなたが賢くないので、これを個人的に受け取らないでください(Pythonを始めたときに私自身もまったく同じ愚かなエラーをしました)。もしあなたが本当に他と違うことをしたいのであれば、Python で驚くほどバグのないソフトウェアを書くことによってそうしてください。単に悪いインデントを使用したり、関数や変数に悪い名前を選んだりするだけではありません。ワンランク上の美しさにフォーカス。

最後の 1 つの問題は、(コードが機能しない理由を本当に理解したら) 慎重に使用すればコードを大幅に簡素化できるツールである Python リスト内包表記について実際に読む必要があるということです。追加コードは、たとえば次のようになります

return Matrix([[a + b for a, b in zip(my_row, other_row)]
               for my_row, other_row in zip(self.data, other.data)])

訓練された目にとって、これは元のコードよりも読みやすいです (また、より高速です)。

于 2011-03-17T07:23:15.480 に答える