输入一个矩阵和卷积核,求卷积之后的矩阵
输入:原矩阵大小,数值 ,卷积核大小,卷积核数值
输出:卷积之后的矩阵
示例:
输入:
3 3
1 1 1
1 1 1
1 1 1
2
2 2
2 2
输出:
8 8
8 8
C++代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int m, n;
cin >> m >> n;
vector<vector<int>> data(m, vector<int>(n, 0));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> data[i][j];
}
}
int k;
cin >> k;
vector<vector<int>> kernel(k, vector<int>(k, 0));
for (int i = 0; i < k; i++)
{
for (int j = 0; j < k; j++)
{
cin >> kernel[i][j];
}
}
//输入完成
vector<vector<int>> res(m - k + 1, vector<int>(n - k + 1, 0));
for (int i = 0; i < m - k + 1; i++)
{
for (int j = 0; j < n - k + 1; j++)
{
int temp = 0;
for (int x = 0; x < k; x++)
{
for (int y = 0; y < k; y++)
{
temp += data[i + x][j + y] * kernel[x][y];
}
}
res[i][j] = temp;
}
}
for (int i = 0; i < res.size(); i++)
{
for (int j = 0; j < res[0].size(); j++)
{
cout << res[i][j] << " ";
}
cout << endl;
}
return 0;
}
python代码:
def getMatrix(arr,kernel):
row=len(arr)
col=len(arr[0])
size=len(kernel)
res=[]
for i in range(row-size+1):
curRow=[]
for j in range(col-size+1):
temp=0
for x in range(size):
for y in range(size):
temp+=arr[i+x][y+j]*kernel[x][y]
curRow.append(int(temp))
res.append(curRow)
for res_row in res:
for res_col in res_row:
print(res_col,end=" ")
print()
if __name__=="__main__":
import sys
m,n=sys.stdin.readline().strip().split()
arr=[]
for i in range(int(m)):
arr1=sys.stdin.readline().strip()
arr1=list(map(int,arr1.split()))
arr.append(arr1)
size=sys.stdin.readline().strip()
kernel=[]
for i in range(int(size)):
kernel1=sys.stdin.readline().strip()
kernel1=list(map(int,kernel1.split()))
kernel.append(kernel1)
getMatrix(arr,kernel)