1. 程式人生 > >百道Python入門級練習題(新手友好)第一回合——矩陣乘法

百道Python入門級練習題(新手友好)第一回合——矩陣乘法

回合 習題 字符 for循環語句 pytho === tar star app

題目描述

【問題描述】
編寫程序,完成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
123

知識點


輸入一組整數
矩陣的輸入
矩陣乘法
矩陣的輸出
輸出的值占8格


步驟1:輸入一組整數

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

對以上代碼,說明如下:
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)123456789101112131415161718

對於以上代碼,解釋如下:
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)12345678

對於以上代碼,說明如下:
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))12

對以上代碼說明如下:
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))12345678910111213141516171819202122232425262728293031323334353637383940


小結

分步驟解題,每步達成一個小目標。
每一步的末尾,打印輸出中間結果,有利於驗證代碼是否正確。
不熟悉的話,多讀幾遍,自己默寫幾遍,就會成為你的代碼。Python學習資料或者需要代碼、視頻加這個群吧548加上377還有875 都在這裏了

百道Python入門級練習題(新手友好)第一回合——矩陣乘法