热线电话:13121318867

登录
2018-12-06 阅读量: 1379
矩阵乘法

假设 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)。

0.0000
0
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子