Цикл двух матриц в java - PullRequest
       6

Цикл двух матриц в java

2 голосов
/ 10 апреля 2020

Я довольно новичок ie в java и программирую в целом, и у меня есть проект для распознавания текста по изображениям для Android. Я работаю в Android Studio и в настоящее время у меня есть две матрицы - одна со значениями для исходного изображения, взятого из галереи устройства, и одна со значениями для изображения шаблона. Значения в матрицах - это в основном цвета пикселей, работающих в оттенках серого, разделенных на 6 интервалов: значение цвета 255-214 равно 0, значение цвета 172-213 равно 0,2, значение цвета 129-171 равно 0,4 и т. Д. c .

Мне нужно go построчно в обеих матрицах и провести с ними некоторые подсчеты - взять первое значение в первой строке исходной матрицы и первое значение в первой строке матрицы шаблона и использовать его в формула:

nIntensity = 1 - abs(template_value - source_value)

и сделать это для всех значений в одной строке, затем суммировать эти значения и go для второй строки и сделать то же самое (в результате получается массив значений x nIntensity для x матричные линии). Сначала я попытался использовать вложенные циклы, но я как-то переборщил с ними:

for(int sRow = 0; sRow < sourceMatrix.length; sRow++) {
    for(int sColumn = 0; sColumn < 1; sColumn++) {
        for(int pRow = 0; pRow < patternMatrix.length; pRow++) {
            for(int pColumn = 0; pColumn < 1; pColumn++) {
                nIntensity += (1 - abs(patternMatrix[pRow][pColumn] - sourceMatrix[sRow][sColumn]));}}}}

, что привело к слишком высоким значениям для переменной nIntensity - с 56 значениями, равными 1,0 в строке как для sourceMatrix, так и для patternMatrix Я должен получить результат числа 56, вместо этого я получил 3192, подразумевая, что он проходит слишком много раз через все циклы. С sColumn < 1 и pColumn < 1 я пытался добиться простоты с самого начала и взять только первую строку обеих матриц, прежде чем углубиться в это и работать с несколькими строками.

После выполнения некоторых В ходе исследования я попытался сделать это довольно просто с помощью кода:

for(int sRow = 0; sRow < sourceMatrix.length; sRow++) {
    for (int sColumn = 0; sColumn < 1; sColumn++) {
         nIntensity += (1 - abs(patternMatrix[sRow][sColumn] - sourceMatrix[sRow][sColumn]));
         System.out.println("Result: " + nIntensity);}}

, который, когда я печатаю результаты после каждого l oop, фактически приводит к результату 56, однако вылетает с исключением

Причина: java .lang.ArrayIndexOutOfBoundsException: length = 56; индекс = 56

1 Ответ

2 голосов
/ 10 апреля 2020

Вы неправильно вложили циклы.

Замените

for(int sRow = 0; sRow < sourceMatrix.length; sRow++) {
    for(int sColumn = 0; sColumn < 1; sColumn++) {
        for(int pRow = 0; pRow < patternMatrix.length; pRow++) {
            for(int pColumn = 0; pColumn < 1; pColumn++) {
                nIntensity += (1 - abs(patternMatrix[pRow][pColumn] - sourceMatrix[sRow][sColumn]));}}}}

на

for(int sRow = 0, pRow=0; sRow < sourceMatrix.length && pRow < patternMatrix.length; sRow++, pRow++) {
    for(int sColumn = 0; sColumn < 1; sColumn++) {
        nIntensity += (1 - abs(patternMatrix[pRow][pColumn] - sourceMatrix[sRow][sColumn]));
    }
}

Кроме того, в следующем блоке кода вы не находитесь проверка границ для patternMatrix. Замените этот кодовый блок

for(int sRow = 0; sRow < sourceMatrix.length; sRow++) {
    for (int sColumn = 0; sColumn < 1; sColumn++) {
         nIntensity += (1 - abs(patternMatrix[sRow][sColumn] - sourceMatrix[sRow][sColumn]));
         System.out.println("Result: " + nIntensity);}}

на

for(int sRow = 0; sRow < sourceMatrix.length && sRow < patternMatrix.length; sRow++) {
    for (int sColumn = 0; sColumn < 1; sColumn++) {
         nIntensity += (1 - abs(patternMatrix[sRow][sColumn] - sourceMatrix[sRow][sColumn]));
         System.out.println("Result: " + nIntensity);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...