源码:
import java.util.Scanner;
public class Main {
public int[][] datas;//数据元素
public int rows;//行数
public int cols;//列数
public Main(int r, int c){
datas = new int[r][c];//创建一个二维数组对象,行和列共同构成一个数据元素
this.rows = r;
this.cols = c;
}
//卷积运算
public Main conv(Main Kernel){
int width =Kernel.rows/2;//核函数的1/2宽度
int length=Kernel.cols/2;//核函数的1/2宽度
Main temp = new Main(this.rows+2*width,this.cols+2*length);//构建一个新的矩阵,用于卷积计算————核矩阵为偶数?如何处理
//构建一个矩阵,用来进行计算
for(int i = width; i<this.rows+width;i++){//矩阵要乘的行数
for(int j = length;j<this.cols+length;j++){//每一行要乘的列数
temp.datas[i][j]=datas[i-width][j-length];//构建上下边缘为空的矩阵,上下距离width length
}
}
//循环计算结果矩阵中的值
for(int i = width; i<this.rows+width;i++){//矩阵要乘的行数
for(int j = length;j<this.cols+length;j++){//每一行要乘的列数
this.datas[i-width][j-length]=mutiKernel(Kernel,temp,i,j,width,length);//计算数值
}
}
return this;
}
//使用核函数计算结果矩阵中每一个位置的值,
public int mutiKernel(Main Kernel, Main temp, int i, int j, int width, int length) {
int number =0;
for(int m = 0; m<Kernel.rows;m++){//矩阵要乘的行数
for(int n = 0;n<Kernel.cols;n++){//每一行要乘的列数
number+=Kernel.datas[m][n]*temp.datas[i-width+m][j-length+n];//循环计算结果
}
}
return number;
}
public void display(){//打印矩阵
if(this == null) return;
for(int i = 0;i<this.rows;i++){
for(int j = 0;j<this.cols;j++){
System.out.print(pd(this.datas[i][j])+" ");
}
System.out.println();
}
}
public Main turn(){//翻转矩阵 180度
int temp=0;
//水平翻转
for (int i = 0; i < this.rows / 2; i++) {
for (int j = 0; j < this.cols; j++) {
temp = this.datas[i][j];
this.datas[i][j] = this.datas[this.rows - 1 - i][j];
this.datas[this.rows - 1 - i][j] = temp;
}
}
//垂直翻转
for (int i = 0; i < this.rows; i++) {
for (int j = 0; j < this.cols / 2; j++) {
temp = this.datas[i][j];
this.datas[i][j] = this.datas[i][this.cols - 1 - j];
this.datas[i][this.cols - 1 - j] = temp;
}
}
return this;
}
public static int pd(int n){
if(n<0){
return 0;
}
if(n>255){
return 255;
}
return n;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int l1,l2,p1,p2;
l1 = sc.nextInt();
l2 = sc.nextInt();
p1 = sc.nextInt();
p2 = sc.nextInt();
Main m = new Main(l1,l2);
Main m1 = new Main(p1,p2);
for (int i = 0; i < l1; i++) {
for (int j = 0; j < l2; j++) {
m.datas[i][j] = sc.nextInt();
}
}
for (int i = 0; i < p1; i++) {
for (int j = 0; j < p2; j++) {
m1.datas[i][j] = sc.nextInt();
}
}
m.conv(m1).display();
}
}