65238


[AOJ
ITP1_7_D](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_D&lang=ja)の問題で、2つの行列の積を求める問題で、

[code]

    N,M,L = map(int,input().split())
    A = [list(map(int,input().split())) for i in range(N)] 
    B = [list(map(int,input().split())) for i in range(M)] 
    C = [[0]*(N) for i in range(L)]
    for k in range(N):
      for i in range(L):
        tmp = 0
        for m in range(M):
          tmp += A[k][m]*B[m][i]
        C[k][i] = tmp
    
    fuga = [" ".join(map(str, i))  for i in C]
    print('\n'.join(map(str, fuga)))
    
[/code]

以上のコードが

[code]

    3 2 3
    1 2
    0 3
    4 5
    1 2 1
    0 3 2
    
[/code]

という入力だと綺麗に実行されるのですが、

[code]

    2 3 4
    1 2 3
    0 1 3
    1 2 3 4
    1 0 2 1
    1 0 3 2
    
[/code]

の場合だと、

[code]

    IndexError                                Traceback (most recent call last)
    <ipython-input-8-757105507a04> in <module>()
         14     for m in range(M):
         15       tmp += A[k][m]*B[m][i]
    ---> 16     C[k][i] = tmp
         17 
         18 fuga = [" ".join(map(str, i))  for i in C]
    
    IndexError: list assignment index out of range
    
[/code]

とRuntime Errorが出てしまいます。  
入力する行列の行数か変わるとerrorが出てしまう原因が分かりません。


CC BY-SA 4.0
2020-03-30T08:27:10.490
65235
2020-03-30T09:08:14.507
36869
question
python python3
list assignment index out of rangeになってしまうのですが、原因が分かりません


行と列が逆になっています。

n 行 m 列の行列と m 行 l 列の行列の積は n 行 l 列になります。したがって今回 `C` は `N` 行 `L`
列の行列として初期化したいはずです。

今回リストの中にリストを入れることで行列を表現しており、内側のリストが行を表すようになっています。つまり次のように定義された `C` は `L` 行 `N`
列の行列です。行と列が逆になっています。

[code]

    C = [[0] * N for i in range(L)]
    
[/code]

このように、正方行列では出なかったエラーが非正方行列で出るようになった場合は行と列を取り違えていないか確認してみてください。


CC BY-SA 4.0
2020-03-30T09:08:14.507
65238
2020-03-30T09:08:14.507
19110
65235
answer