1. 程式人生 > >Python入門100道習題(8)——矩陣乘法

Python入門100道習題(8)——矩陣乘法

題目描述

【問題描述】
編寫程式,完成3*4矩陣和4*3整數矩陣的乘法,輸出結果矩陣。

【輸入形式】
一行,供24個整數。以先行後列順序輸入第一個矩陣,而後輸入第二個矩陣。

【輸出形式】
先行後列順序輸出結果矩陣,每個元素的顯示寬度為8格,螢幕一行只顯示矩陣的一行。

【樣例輸入】

1 2 3 4 5 6 7 8 9 1 2 3 9 8 7 6 5 4 3 2 1 1 2 3

上面的輸入,意味著要計算如下兩個矩陣的乘積。

第一個矩陣 :

1 2 3 4

5 6 7 8

9 1 2 3

第二個矩陣:
9 8 7

6 5 4

3 2 1

1 2 3
【樣例輸出】
左側的1,2,3不是程式輸出的內容。

  34      32      30
  110     100     90
  96      87      78

知識點

  1. 輸入一組整數
  2. 矩陣的輸入
  3. 矩陣乘法
  4. 矩陣的輸出
  5. 輸出的值佔8格

步驟1:輸入一組整數

line = input().split()
nums = []
for s in line:
    nums.append(int(s))
print(nums)

對以上程式碼,說明如下:
1. 第1行,input()讀入整行,split()以空格為分隔符把整行分割成多段,生成數字字串列表line。
2. 第2行,nums變數用來儲存整數列表,初始化為空列表。
3. 第3,4行,for迴圈的作用是遍歷數字字串列表line內的每個元素s,把這個元素s轉換為整數後,加到nums列表尾部。
4. 第5行,列印nums列表的值,可以幫助檢查是否輸入成功。

步驟2:生成兩個相乘的矩陣

步驟2是把步驟1接收到的整數分裝到兩個矩陣內。

#1.1 第1個矩陣
mtx1 = []
for r in range(3):
    row = []
    for c in range(4):
        row.append(nums[r * 4 + c])
    mtx1.append(row)
print(mtx1)

#第二個矩陣
mtx2 = []
start = 3 * 4  #起點下標
for r in range(4):
    row = []
    for c in range(3):
        row.append
(nums[start + r * 3 + c]) mtx2.append(row) print(mtx2)

對於以上程式碼,解釋如下:
1. 第2行,mtx1用來記住第一個矩陣。它是3行4列的矩陣。它的初值是空列表。
2. 第3行到第7行,是一個for迴圈。每迴圈一次,得到矩陣的一行。row變數用來記住這一行。
3. 第4行,row變數初始化為空列表。
4. 第5,6行,是一個for迴圈。每迴圈一次,就往row列表中加入一個整數。迴圈4次,就生成了一行。
5. 第7行,把矩陣的一行加到mtx1的尾部。mtx1是以列表作為元素的列表,也即矩陣。
6. 第9行開始,生成第二個矩陣mtx2。生成第二個矩陣的做法與生成第一個矩陣的做法是類似的。不同點有兩處。第一處是,矩陣的元素來自nums列表中start位置及其後的元素。第二處不同是,第二個矩陣是4行3列的。
7. print(mtx1)和print(mtx2)這兩條語句用於列印兩個矩陣的值,幫助檢查是否正確生成了兩個矩陣。不過,矩陣的元素在螢幕上沒有分行顯示,而是顯示在同一行。

步驟3:矩陣相乘

3行4列的矩陣乘以4行3列的矩陣,結果是3行3列的矩陣。你事先要熟悉矩陣的乘法。
以下程式碼的思路是,依次求出3行3列矩陣的每一個元素的值。

#矩陣乘法
result = []
for r in range(3):
    row = []
    for c in range(3):
        v = mtx1[r][0] * mtx2[0][c]  + mtx1[r][1] * mtx2[1][c] + mtx1[r][2] * mtx2[2][c] + mtx1[r][3] * mtx2[3][c]
        row.append(v)
    result.append(row)

對於以上程式碼,說明如下:
1. result用來儲存3行3列的矩陣。
2. 第2行到第7行構成一條for迴圈語句。一共迴圈3次。每迴圈一次,求出result矩陣的一行。
3. 第3行,row變數用來儲存矩陣的一行。初值設為空列表。
4. 第4行到第6行構成一條for迴圈語句。這是內迴圈。一共迴圈3次。每迴圈一次,求出第r行(r從0開始編號)中的一個元素的值。v變數記住這個值。第6行把v變數加到row列表尾部。
5. 第7行,row加到result矩陣尾部,成為新的一行。

步驟4:輸出矩陣

輸出矩陣要滿足兩個要求:
1. 分成3行。
2. 每一行的每個元素佔8格。
程式碼是:

for r in range(3):
    print(str(result[r][0]).rjust(8) + str(result[r][1]).rjust(8) + str(result[r][2]).rjust(8))

對以上程式碼說明如下:
1. for迴圈一共執行3次。每一次,輸出矩陣的一行。
2. str(result[r][0]).rjust(8)的作用是,首先把元素result[r][0]轉換為字串形式的值,然後呼叫字串的rjust方法,使得字串長度不足8格的話,左側填充空格。假設,result[r][0]值是34,那麼輸出的時候,左側將填充6個空格,形成有8個字元的字串,即“======34”。這裡,=代表的是空格。

完整的程式碼

#矩陣乘法

#1. 輸入
line = input().split()
nums = []
for s in line:
    nums.append(int(s))
print(nums)

#1.1 第1個矩陣
mtx1 = []
for r in range(3):
    row = []
    for c in range(4):
        row.append(nums[r * 4 + c])
    mtx1.append(row)
print(mtx1)

#第二個矩陣
mtx2 = []
start = 3 * 4  #起點下標
for r in range(4):
    row = []
    for c in range(3):
        row.append(nums[start + r * 3 + c])
    mtx2.append(row)
print(mtx2)

#矩陣乘法
result = []
for r in range(3):
    row = []
    for c in range(3):
        v = mtx1[r][0] * mtx2[0][c]  + mtx1[r][1] * mtx2[1][c] + mtx1[r][2] * mtx2[2][c] + mtx1[r][3] * mtx2[3][c]
        row.append(v)
    result.append(row)

#輸出結果矩陣
for r in range(3):
    print(str(result[r][0]).rjust(8) + str(result[r][1]).rjust(8) + str(result[r][2]).rjust(8))

小結

  1. 分步驟解題,每步達成一個小目標。
  2. 每一步的末尾,列印輸出中間結果,有利於驗證程式碼是否正確。
  3. 不熟悉的話,多讀幾遍,自己默寫幾遍,就會成為你的程式碼。