1

2つの行列を掛ける手順は次のとおりです。

ステップ 1: 1 番目の列の数が 2 番目の列の数と同じであることを確認します。

ステップ 2: 最初の行列の各行の要素に 2 番目の行列の各列の要素を掛けます。

ステップ 3: 製品を追加します。

2番目のステップをどのように行いますか?

例えば

A = [[3,4,5],[5,0,6],[5,7,1]]

B = [[2,1,3],[2,6,4]]

これまでのところ、2番目の列の各列を見つける関数を取得しました

def column(B,j):
    col = []
    for column in B:
        col.append(column[j])
    return col

次に、最初の行の各行を見つける関数を作成する必要があります

def rows(A,i):

しかし、その後、それらを乗算する関数を作成する方法がわかりません

row(A,0) • col(B,0)

row(A,0) • col(B,1)

row(A,1) • col(B,0)

row(A,1) • col(B,1)

row(A,2) • col(B,0)

row(A,2) • col(B,1)
4

4 に答える 4

3

おそらくnumpyを使用する必要があります:

import numpy as np
np.dot(row(A,0), col(B,0))

ただし、それを使用したくない場合は、次のようにすることができます。

def dot(arr1, arr2):
    return sum([x*y for x,y in zip(arr1, arr2)])

dot(row(A,0), col(B,0))
于 2013-03-27T17:07:57.407 に答える
1

これにリストを使用することを主張する場合....

C = ABの場合、必要です

C_{ij} = sum(A_{ik} * B_{kj})

ここで、i、j、k は添え字で、最初の添え字は行を表し、2 番目の添え字は列を表します。i、j、k は、行列の行と列 (つまり、リスト インデックス) にわたって実行されるため、i、j、および k に対して for ループを記述できます。

于 2013-03-27T17:07:32.733 に答える
1

A には 3 つの列があり、B には 2 つの行があります。したがって、あなたの例は、ステップ 1 で述べた要件と矛盾しているように見えます。それにもかかわらず、これは探しているものに近いかもしれません。

In [1]: A = [[3,4,5],[5,0,6],[5,7,1]]

In [2]: B = [[2,1,3],[2,6,4]]

In [3]: [[sum(r*c for r,c in zip(row, col)) for col in B] for row in A]
Out[3]: [[25, 50], [28, 34], [20, 56]]

ところで、これは役に立つと思われる便利なトリックです: 行列を転置したい場合は、次を使用しますzip(*B):

In [4]: zip(*B)
Out[4]: [(2, 2), (1, 6), (3, 4)]

の列を簡単にループできるため、これは便利ですB

于 2013-03-27T17:24:20.087 に答える
0

これがうまくいった例です:

>>> from pprint import pprint
>>> def mmul(A, B):
        nr_a, nc_a = len(A), len(A[0])
        nr_b, nc_b = len(B), len(B[0])
        if nc_a != nr_b:
            raise ValueError('Mismatched rows and columns')
        return [[sum(A[i][k] * B[k][j] for k in range(nc_a))
                 for j in range(nc_b)] for i in range(nr_a)]

>>> A = [[1, 2, 3, 4]]
>>> B = [[1],
         [2],
         [3],
         [4]]

>>> pprint(mmul(A, B))
[[30]]

>>> pprint(mmul(B, A), width=20)
[[1, 2, 3, 4],
 [2, 4, 6, 8],
 [3, 6, 9, 12],
 [4, 8, 12, 16]
于 2013-03-28T15:10:54.800 に答える