###### tags: `APCS` # **d481-矩陣乘法** ### **題目連結:** [**d481**](https://zerojudge.tw/ShowProblem?problemid=d481) ### **題目解析** 我們需要根據給定的矩陣維度和數據來計算兩個矩陣的乘積。如果矩陣的維度不符合乘法條件(第一矩陣的列數等於第二矩陣的行數),則輸出Error。 ### **解題方向** 1. 輸入讀取與驗證 * 首先讀取四個整數`a, b, c, d`,分別代表第一個矩陣的行數和列數、第二個矩陣的行數和列數。 * 驗證矩陣乘法條件:只有當第一個矩陣的列數`b`等於第二個矩陣的行數`c`時,矩陣乘法才有意義。如果不滿足這個條件,則直接輸出`Error`並處理下一組數據。 1. 矩陣數據讀取 * 讀取第一個矩陣`A`的數據,行數為`a`,每行有`b`個元素。 * 讀取第二個矩陣`B`的數據,行數為`c`,每行有`d`個元素。 1. 矩陣乘法計算 * 初始化一個新的矩陣`C`,行數為`a`,列數為`d`,初始值設為`0`。 * 使用三重迴圈計算矩陣乘法: * 外層迴圈遍歷`C`的行數(即`A`的行數)。 * 中層迴圈遍歷`C`的列數(即`B`的列數)。 * 內層迴圈計算對應位置的元素值,這是根據矩陣乘法的定義:將`A`的行與`B`的列進行內積計算。 1. 結果輸出 * 輸出矩陣`C`,每行的元素以空格分隔。 ### **程式解析** 輸入讀取與維度檢查 ```python conf = input() data = list(map(int, conf.split())) a, b, c, d = data[0], data[1], data[2], data[3] if b != c: print("Error") continue ``` * 讀取輸入數據並解析出矩陣的行和列數。 * 使用條件語句檢查矩陣的乘法條件是否滿足:第一個矩陣的列數`b`必須等於第二個矩陣的行數`c`。 讀取矩陣數據 ```python # 讀取矩陣 A A = [] for i in range(0, a): row = input() row = list(map(int, row.split())) A.append(row) # 讀取矩陣 B B = [] for i in range(0, c): row = input() row = list(map(int, row.split())) B.append(row) ``` * 根據輸入的維度讀取兩個矩陣`A`和`B`的數據。 * 每行數據用空格分隔,並轉換為整數列表後加入對應的矩陣中。 初始化結果矩陣 ```python # 初始化矩陣 C C = [] for i in range(0, a): row = [0 for column in range(0, d)] C.append(row) ``` 建立一個`a x d`的矩陣`C`來存放計算結果,初始值設為`0`。 矩陣乘法計算 ```python # 矩陣乘法計算 C = A * B for i in range(0, a): for j in range(0, d): for k in range(0, c): C[i][j] += A[i][k] * B[k][j] ``` * 三重迴圈計算矩陣乘法: * `i` 遍歷矩陣`C`的行,對應矩陣`A`的行。 * `j` 遍歷矩陣`C`的列,對應矩陣`B`的列。 * `k` 用於計算內積,遍歷矩陣`A`的列(即`B`的行)。 結果輸出 ```python # 輸出結果矩陣 C for i in range(0, a): for j in range(0, d): print(C[i][j], end=' ') print() ``` * 遍歷並輸出計算出的矩陣`C`,每個元素以空格分隔。 * 每行結束後打印換行符,準備輸出下一行。 ### **完整程式碼** ```python= while True: try: # 讀取矩陣配置 conf = input() data = list(map(int, conf.split())) # 解析矩陣維度 a, b, c, d = data[0], data[1], data[2], data[3] # 檢查矩陣乘法條件 if b != c: print("Error") continue else: # 讀取矩陣 A A = [] for i in range(0, a): row = input() row = list(map(int, row.split())) A.append(row) # 讀取矩陣 B B = [] for i in range(0, c): row = input() row = list(map(int, row.split())) B.append(row) # 初始化矩陣 C C = [] for i in range(0, a): row = [0 for column in range(0, d)] C.append(row) # 矩陣乘法計算 C = A * B for i in range(0, a): for j in range(0, d): for k in range(0, c): C[i][j] += A[i][k] * B[k][j] # 輸出結果矩陣 C for i in range(0, a): for j in range(0, d): print(C[i][j], end=' ') print() except: break ```