//
// main.cpp
// codehomework #11
//
// Created by YTC on 2022/5/18.
//
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, const char * argv[]) {
int const map = 6;
int F [map*map] = { 18, 16, 12, 8, 5, 0,
15, 18, 18, 10, 2, 8,
12, 10,20,5, -6, 4,
5, 6, 10,19, 10,3,
0, 2, 7, 9, 18, 1,
4 ,6, 5 , 2, 0, 17};
int const kernel = 3;
int C [kernel*kernel] = { 0, -1, 0,
-1, 4, -1
,0, -1, 0 };
int const outm = map - kernel + 1;
int const conH = map * map;
int const conW = kernel * kernel;
float container[conW * conH] = { 0 };
for(int i = 0 ; i < outm; i++){
for(int j = 0 ; j < outm;j++){
int wh = i * outm * conW + j* conW;
int col1 = i * map + j ;
container[wh] = F[col1];
container[wh+1] = F[col1 + 1];
container[wh+2] = F[col1 + 2];
int col2 = (i+1) * map + j;
container[wh + 3] = F[col2];
container[wh + 4] = F[col2 + 1];
container[wh + 5] = F[col2 + 2];
int col3 = (i+2) * map + j;
container[wh + 6] = F[col3];
container[wh + 7] = F[col3 + 1];
container[wh + 8] = F[col3 + 2];
}
}
vector<int> c;
for(int i = 0 ; i < outm ; i++){
for(int j = 0 ; j < outm ; j++)
{
int a = 0 ;
int wh = i * outm * conW + j * conW;
for(int m = 0 ; m < conW ; m++){
a += container[wh + m]* C[m];
}
c.push_back(a);
}
}
cout<< "Convolved matrix: "<< endl;
for(int i = 0 ; i < map ; i++){
for(int j = 0 ; j < map ; j++){
cout << F[i * map +j] << " ";
}
cout<< endl;
}
cout << endl;
cout << "Kernel matrix: " << endl;
for(int i = 0 ; i < kernel; i++){
for(int j = 0 ; j < kernel ; j++){
cout << C[i*kernel + j] << " ";
}
cout << endl;
}
cout << endl;
cout << "The result matrix: " <<endl;
for(int i = 0 ; i < outm ; i++){
for(int j = 0 ; j < outm ; j++){
cout<< c[i * outm + j ]<< " ";
}
cout << endl;
}
return 0;
}