Java, сравните маленький 2D массив с каждой возможной итерацией в большем 2D массиве

1

Хорошо, поэтому мне нужно иметь возможность искать через большой массив (скажем, 15x20 или 20x17) того, что является полем ничего, кроме единиц и нулей, чтобы найти, какой шаблон 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 снова и снова, не переходя в другой блок, ни в сторону, ни вниз. Любые советы вообще были бы полезны здесь, я вытягиваю свои волосы, когда мы говорим. EDIT: Sample Input Number Array:

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, сравнивать ее с первой и возвращать оценку, основанную на их сходстве, возвращая самую высокую.

Теги:
arrays
multidimensional-array
matrix

1 ответ

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, идентифицируя верхний правый суб-массив как идеальное совпадение.

  • 0
    Я добавил тестовые случаи. И меня не столько интересует, где находится под-массив, сколько сколько набрал наивысший балл, так как я проверяю его с 9 другими массивами, чтобы увидеть, на какой из них он больше всего похож. Следовательно, условные операторы ближе к концу, где, если они оба равны 1, оценка увеличивается на 1, если текущая матрица находится в 0, а входная матрица чисел 1, она уменьшается на 0,25, а если оба равны 0, оценка увеличивается на 0,25
  • 0
    @ChuckDivebomb Да, это то, что делает мой. Насколько я вижу, ваша система подсчета очков излишне сложна для определения сходства. Если они совпадают, добавьте один. Если нет, не надо. Возвращенное число является наибольшим количеством совпадений. Если вы действительно хотите, чтобы я работал с вашим счетом, я могу это сделать, но это довольно тривиальное изменение.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню