假设 A 是一个 n1×k1 矩阵, B 是一个 n2×k2 矩阵,并且 k1 = n2,那么这两个矩阵的乘积
AB 则是一个 n1×k2 矩阵,其中第 (i,j) 项为:
A
i1B1j+ Ai2B2j+…+ AikBkj
下面,我们仅计算矩阵 A 的第 i 行(可以视为一个向量)与矩阵 B 的第 j 列(也可以视为
一个向量)的点积,具体代码如下所示:
def matrix_product_entry(A, B, i, j):
return dot(get_row(A, i), get_column(B, j))
之后,我们就可以通过下列代码实现矩阵的乘法运算了:
def matrix_multiply(A, B):
n1, k1 = shape(A)
n2, k2 = shape(B)
if k1 != n2:
raise ArithmeticError("incompatible shapes!")
return make_matrix(n1, k2, partial(matrix_product_entry, A, B))
请注意,如果 A 是一个 n×k 矩阵, B 是一个 k×1 矩阵,那么 AB 则为 n×1 矩阵。如果
我们将一个向量看作是一维矩阵, 就可以把 A 看作是将 k 维向量映射为 n 维向量的一个函
数,实际上这个函数就是矩阵乘法。
之前,我们将向量简单地表示为列表,实际上两者之间是不能完全划等号的:
v = [1, 2, 3]
v_as_matrix = [[1],
[2],
[3]]
因此,我们需要定义相应的辅助函数,以便实现两种表示形式之间的转换:
def vector_as_matrix(v):
"""returns the vector v (represented as a list) as a n x 1 matrix"""
return [[v_i] for v_i in v]
def vector_from_matrix(v_as_matrix):
"""returns the n x 1 matrix as a list of values"""
return [row[0] for row in v_as_matrix]








暂无数据