好吧所以我需要能够搜索一个大的数组(比如15x20或20x17)什么是除了1和0之外的任何字段来找到它们的布局最准确反映的13x13数字模板,在某种形式下原始的OCR。我的问题是我需要在较大数组的每次可能迭代中移动一个13x13数组,以查看它与数字数组最匹配的位置。这就是我尝试过的:
public double compareMatrices(int[][] num,int[][] mat){
double score=0;
double highest=0;
int n=0;
for(;n+num.length<mat.length;n++){
int[][] rows=new int[num.length][];
int m=0;
for(;m+num.length<mat[0].length;m++){
for(int o=0;o<num.length;o++){
rows[o]=Arrays.copyOfRange(mat[n+o],m,m+num.length);
}
int p=0;
for(;p<rows.length;p++){
int q=0;
for(;q < rows[0].length;q++){
if((rows[p][q]==1)&&(num[p][q]==1)){
score+=1;
}
else if((num[p][q]==1)&&(rows[p][q]==0)){
score-=.25;
}
else if((num[p][q]==0)&&(rows[p][q]==0)){
score+=.25;
}
}
}
}
if(score>highest){
highest=score;
score=0;
}
else{
score=0;
}
}
return(highest);
我的问题是,这似乎一遍又一遍地重复相同的13x13块,而不是向侧面或向下移动到不同的块。任何建议在这里都会有所帮助,我在说话的时候把头发拉出来。 编辑: 示例输入数字数组:
0000001000000
0000011000000
0000011000000
0000101000000
0000001000000
0000001000000
0000001000000
0000001000000
0000001000000
0000001000000
0000001000000
0000001000000
0000111110000
我想搜索:
0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0
0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
我想搜索每个可能的13 x 13矩阵的第二个,将它与第一个矩阵进行比较,然后根据它们的相似性返回分数,返回最高分。
答案 0 :(得分:0)
这里整洁的问题,无法抗拒它。这个解决方案适用于我提供的人为的样本数据。
public static double compareMatrices(int[][] num, int[][] mat)
{
double score = 0;
double highest = 0;
for (int numX = 0; numX <= num.length - mat.length; numX++)
{
for (int numY = 0; numY <= num[0].length - mat[0].length; numY++)
{
score = 0;
for (int matX = 0; matX < mat.length; matX++)
{
for (int matY = 0; matY < mat[0].length; matY++)
{
if (num[numX + matX][numY + matY] == mat[matX][matY])
score++;
}
}
if(score >highest)
highest = score;
}
}
return highest; //highest num of elements in array that match sub-array
}
示例数据:
int[][] now = { { 1, 1, 1, 0 },
{ 0, 0, 0, 1 },
{ 1, 1, 1, 1 } };
int[][] no = { { 1, 0 },
{ 0, 1 } };
System.out.println(compareMatrices(now, no));
哪个输出4.0
,将右上方的子阵列标识为完美匹配。