Использование strfind в Matlab для разных диагональных направлений в матрице

Прежде чем кто-либо спросит, это репост более раннего вопроса, но я не могу удалить его, потому что в нем есть ответы, поэтому я изменяю его, чтобы, надеюсь, Дэниел Р. ответил на него!

У меня есть сетка чисел, и я хочу прочитать строку чисел с strfind в любом из 8 направлений. С недиагональными мне удалось заставить работать нормально, а с диагональными я боролся (за исключением downRight, с которым Дэниел Р помог мне ранее, за что я ему очень благодарен)!

Вот код:

A = [5,16,18,4,9;
    9,10,14,3,18;
    2,7,9,11,21;
    3,7,2,19,22;
    4,9,10,13,8]

for r = 1:5
    for diags = -5:5
        downRight = strfind(diag(A,diags)', [10,9,19]);
        if isempty(downRight) == 0;
            rowOfFirstNum = downRight(1)+max(-diags,0);
            columnOfFirstNum = downRight(1)+max(diags,0);
        end
        downLeft = strfind(diag(rot90(A),diags)', [11,2,9]);
        if isempty(downLeft) == 0;
            %rowOfFirstNum = 
            %columnOfFirstNum = 
        end
        upLeft = strfind(diag(rot90(A,2),diags)', [19,9,10]);
        if isempty(upLeft) == 0;
            %rowOfFirstNum = 
            %columnOfFirstNum = 
        end
        upRight = strfind(diag(rot90(A,3),diags)', [3,7,14,4]);
        if isempty(upRight) == 0;
            %rowOfFirstNum = 
            %columnOfFirstNum = 
        end
    end
end

downRight работает, но я не знаю, как заставить остальные работать правильно. Просто отметим, что для проверки каждого направления необходимо закомментировать остальные 3.

Спасибо.


person user3094936    schedule 12.12.2013    source источник


Ответы (1)


Вопрос, адресованный лично мне, наверное, я должен написать ответ :)

Вместо того, чтобы реализовать все 4 случая, я написал общий случай. Как вы уже заметили, 4 случая можно создать с помощью rot90 (rot90(X,0) ничего не делает).

Чтобы получить индексы, я создал сетку, которая содержит номера строк и столбцов. Просто проведите его через тот же процесс rot90 и diag, чтобы увидеть, какой индекс был перемещен в позицию.

Наконец, внешний цикл (for r = 1:5) просто повторяет все.

A = [5,16,18,4,9;
     9,10,14,3,18;
     2,7,9,11,21;
     3,7,2,19,22;
     4,9,10,13,8];
[col,row]=meshgrid(1:size(A,1));


 x=[10,9,19];
% x=[11,2,9];
% x=[19,9,10];
% x=[3,7,14,4];
for diags = -5:5
    for direction=0:3
        loc = strfind(diag(rot90(A,direction),diags)', x);
        if ~isempty(loc)
            colT=diag(rot90(col,direction),diags);
            rowT=diag(rot90(row,direction),diags);
            rowOfFirstNum=rowT(loc)
            columnOfFirstNum=colT(loc)
            switch direction
            case 0
                %code for downRight
            case 1
                %code for downLeft
            case 2
                %code for upLeft
            case 3
                %code for upRight
            end
        end
    end
end
person Daniel    schedule 12.12.2013
comment
Спасибо. Хотя простите, еще один вопрос. То, как я написал это ранее, позволило мне вычислить rowOfLastNum и columnOfLastNum (надеюсь, названия говорят сами за себя) отдельно для каждого направления (потому что это комбинация строк/столбцов, увеличивающихся или уменьшающихся). Как мне добиться этого с помощью общего кода? - person user3094936; 13.12.2013
comment
Я добавил пустое выражение switch-case. Используйте что-то подобное, чтобы добавить код, относящийся к одному направлению. - person Daniel; 13.12.2013
comment
Отлично, спасибо за всю вашу помощь, я очень ценю это. Могу я спросить вас еще об одном? Этот поиск слов читается с изображения (целые числа являются позициями в алфавите) и поэтому использует классификатор для классификации каждой буквы. Классификатор довольно эффективен (около 95%), но это означает, что около 10 букв во всем словесном поиске будут неправильными. У меня есть функция, которую я сделал, которая вычисляет расстояние редактирования между любыми двумя словами. Есть ли способ, которым я могу использовать это, чтобы определить позицию, в которой будет слово, если некоторые из его букв будут неправильно классифицированы? - person user3094936; 13.12.2013