2017-09-03 23 views
-1

以下代碼是嘗試在Python 3.6.1中創建一個成功的矩陣。正如你所看到的,我有我的阿爾法和布拉沃矩陣分配,並希望代碼產生一個查理矩陣(列表)充滿了阿爾法和布拉沃矩陣相乘的結果。我的問題是,當我運行模塊時,它說c沒有定義;如果我請求a或b,那也是一樣。專業提示或指針的人?謝謝。顯示未分配的Python矩陣代碼變量

import math 

def matrix(a, b, c): 
    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
    b = [[3, 2, 1], [4, 4, 4], [3, 6, 8]] 
    c = [[], [], []] 
    for c in matrix: 
     c[1][1] = a[1][1] * b[1][1] + a[1][2] * b[2][1] + a[1][3] * b[3][1] 
     c[1][2] = a[1][1] * b[1][2] + a[1][2] * b[2][2] + a[1][3] * b[3][2] 
     c[1][3] = a[1][1] * b[1][3] + a[1][2] * b[2][3] + a[1][3] * b[3][3] 
     c[2][1] = a[2][1] * b[1][1] + a[2][2] * b[2][1] + a[2][3] * b[3][1] 
     c[2][2] = a[2][1] * b[1][2] + a[2][2] * b[2][2] + a[2][3] * b[3][2] 
     c[2][3] = a[2][1] * b[1][3] + a[2][2] * b[2][3] + a[2][3] * b[3][3] 
     c[3][1] = a[3][1] * b[1][1] + a[3][2] * b[2][1] + a[3][3] * b[3][1] 
     c[3][2] = a[3][1] * b[1][2] + a[3][2] * b[2][2] + a[3][3] * b[3][2] 
     c[3][3] = a[3][1] * b[1][3] + a[3][2] * b[2][3] + a[3][3] * b[3][3] 
    return c 

回答

1

您的代碼有許多問題。讓我們一次一個地看他們。

  1. Python是零索引。在Python中訪問數組或列表時,第一個元素是0,第二個元素是1,等等。您定義a

    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
    

所以訪問,因爲它不存在a[3][...]將無法​​正常工作。 a[0][1, 2, 3]

  1. 空容器沒有索引。當您定義c時,您定義了一個空列表的列表。在c[0]舉行的名單是一個空的名單[]。因此試圖訪問c[0][0]將無法​​工作,因爲第零個元素不存在(用於引用或分配)。

這是一樣的,如果你做的事:

x = [] 
# this will not work: 
x[0] = 1 

如果要執行一個點的產品,我會建議使用NumPy的包。它旨在處理這種數學。

import numpy as np 

c = np.dot(a, b) 
c 
# returns: 
array([[ 20, 28, 33], 
     [ 50, 64, 72], 
     [ 80, 100, 111]]) 

這裏是採取兩個矩陣的點積純蟒方法。它轉換b併爲每個矩陣生成元素產品的總和。請記住它沒有維度檢查,所以它會截斷到最短的可計算結果。

def matrix_dot(a, b): 
    # transpose b 
    bT = list(map(list, zip(*b))) 
    # generate the dot product 
    c = [[sum(xx*yy for xx,yy in zip(x,y)) for y in bT] for x in a] 
    return c 

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
b = [[3, 2, 1], [4, 4, 4], [3, 6, 8]] 

matrix_dot(a,b) 
# returns: 
[[20, 28, 33], 
[50, 64, 72], 
[80, 100, 111]] 
+0

謝謝詹姆斯。我現在都知道Numpy模塊的存在。但是,假設我選擇不使用像Numpy這樣的模塊,並且決定按照我在上面的原始代碼中所做的那樣進行修改:如果我固​​定了索引位置(從我沒有做的正確位置開始),它會起作用嗎? ,如果我只是爲c變量(即[[0,0,0],[0,0,0],[0,0,0]]而不是列表的空列表分配了佔位符值) ? – Feverdreamer44

+0

是的,這將工作。與索引中的硬編碼相比,有更高效的方法來創建'c'輸出。我將修改我的答案以顯示如何。 – James

+0

我真的很感謝詹姆斯的幫助。你能解釋一下你提供的代碼中的符號嗎,特別是如何生成點積?我不明白使用xx和yy,或者爲什麼使用bT:xx,yy代表zip(x,y)中的yy)代表b中的y – Feverdreamer44