假设 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]
如此一来,我们就可以利用 matrix_multiply 来定义矩阵运算了:
def matrix_operate(A, v):
v_as_matrix = vector_as_matrix(v)
product = matrix_multiply(A, v_as_matrix)
return vector_from_matrix(product)
当 A 是一个方阵时,此操作会将 n 维向量映射为另一个 n 维向量。对于某矩阵 A 和向量
v,对向量 v 进行 A 变换有时候会等效于用一个标量来乘向量 v,即所得到的向量与 v 同
向。当发生这种情况(且 v 不是零向量)时, 我们称 v 为 A 的特征向量。同时,我们称这
个乘数为特征值(eigenvalue)。
暂无数据