# 期中考詳解
## 題目描述
給定一個 `n×n` 的整數矩陣,其中 `n` 為偶數且介於4到20之間。你的任務是對這個矩陣進行 `2x2` 的平均池化操作。[題目本人](https://hackmd.io/@wfit/midtest)
## 概念介紹
### 矩陣(Matrix)
矩陣是一種數學的數據結構,用於表示數據的二維排列。在這題中,矩陣是由整數構成,並且具有 `n×n` 的規模。
### 平均池化(Average Pooling)
平均池化是深度學習中常見的一種降維技術,特別是在處理影像數據時。它的基本思想是取一個區塊(例如2x2的區域)內所有元素的平均值。這樣做可以減少數據的空間尺寸,同時保留重要的特徵。在本題中,每個2x2的子矩陣代表一個處理單元。
### 格式化輸出
在輸出時保留兩位小數是一種常見的數據呈現方式,可以讓結果更加精確且易於閱讀。在C++中,我們使用 `printf("%.2f ",avg);` 來實現,而在Python中,我們使用字符串格式化 `f"{avg:.2f}"` 來實現。
## C++ 解答
```cpp=
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
vector<vector<int>> matrix(n, vector<int>(n));
// 讀取矩陣
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
cin >> matrix[i][j];
// 進行平均池化
for (int i = 0; i < n; i += 2) {
for (int j = 0; j < n; j += 2) {
double avg = (matrix[i][j] + matrix[i][j+1] + matrix[i+1][j] + matrix[i+1][j+1]) / 4.0;
printf("%.2f ",avg);
}
printf("\n");
}
return 0;
}
```
## Python 版解答_1
```python=
import sys # 導入sys模組以使用stdin
input = sys.stdin.read # 從標準輸入讀取所有輸入資料
data = input().split() # 將輸入資料以空白分割成列表
n = int(data[0]) # 讀取矩陣的大小n
matrix = [[int(data[i*n+j+1]) for j in range(n)] for i in range(n)] # 使用列表解析式讀取矩陣數據並轉換為整數
for i in range(0, n, 2): # 外層迴圈以步長2遍歷行,進行平均池化
for j in range(0, n, 2): # 內層迴圈以步長2遍歷列
avg = (matrix[i][j] + matrix[i][j+1] + matrix[i+1][j] + matrix[i+1][j+1]) / 4.0 # 計算4個元素的平均值
print(f"{avg:.2f} ", end='') # 格式化輸出平均值,保留兩位小數
print() # 每完成一行的輸出後換行
```
## Python 版解答_2
```py=
n = int(input()) # 矩陣的大小
matrix = [] # 初始化矩陣
# 讀取矩陣的每一行
for i in range(n):
row = input().split()
matrix.append([int(num) for num in row])
for i in range(0, n, 2): # 外層迴圈以步長2遍歷行,進行平均池化
for j in range(0, n, 2): # 內層迴圈以步長2遍歷列
avg = (matrix[i][j] + matrix[i][j+1] + matrix[i+1][j] + matrix[i+1][j+1]) / 4.0 # 計算4個元素的平均值
print(f"{avg:.2f} ", end='') # 格式化輸出平均值,保留兩位小數
print() # 每完成一行的輸出後換行
```