###### 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
```