假設(shè) A 是一個(gè) n1×k1 矩陣, B 是一個(gè) n2×k2 矩陣,并且 k1 = n2,那么這兩個(gè)矩陣的乘積
AB 則是一個(gè) n1×k2 矩陣,其中第 (i,j) 項(xiàng)為:
A
i1B1j+ Ai2B2j+…+ AikBkj
下面,我們僅計(jì)算矩陣 A 的第 i 行(可以視為一個(gè)向量)與矩陣 B 的第 j 列(也可以視為
一個(gè)向量)的點(diǎn)積,具體代碼如下所示:
def matrix_product_entry(A, B, i, j):
return dot(get_row(A, i), get_column(B, j))
之后,我們就可以通過下列代碼實(shí)現(xiàn)矩陣的乘法運(yùn)算了:
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))
請(qǐng)注意,如果 A 是一個(gè) n×k 矩陣, B 是一個(gè) k×1 矩陣,那么 AB 則為 n×1 矩陣。如果
我們將一個(gè)向量看作是一維矩陣, 就可以把 A 看作是將 k 維向量映射為 n 維向量的一個(gè)函
數(shù),實(shí)際上這個(gè)函數(shù)就是矩陣乘法。
之前,我們將向量簡(jiǎn)單地表示為列表,實(shí)際上兩者之間是不能完全劃等號(hào)的:
v = [1, 2, 3]
v_as_matrix = [[1],
[2],
[3]]
因此,我們需要定義相應(yīng)的輔助函數(shù),以便實(shí)現(xiàn)兩種表示形式之間的轉(zhuǎn)換:
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 來定義矩陣運(yùn)算了:
def matrix_operate(A, v):
v_as_matrix = vector_as_matrix(v)
product = matrix_multiply(A, v_as_matrix)
return vector_from_matrix(product)
當(dāng) A 是一個(gè)方陣時(shí),此操作會(huì)將 n 維向量映射為另一個(gè) n 維向量。對(duì)于某矩陣 A 和向量
v,對(duì)向量 v 進(jìn)行 A 變換有時(shí)候會(huì)等效于用一個(gè)標(biāo)量來乘向量 v,即所得到的向量與 v 同
向。當(dāng)發(fā)生這種情況(且 v 不是零向量)時(shí), 我們稱 v 為 A 的特征向量。同時(shí),我們稱這
個(gè)乘數(shù)為特征值(eigenvalue)。








暫無數(shù)據(jù)