在Matlab中使用strfind处理矩阵中的不同对角方向

在Matlab中使用strfind处理矩阵中的不同对角方向,matlab,matrix,diagonal,stringreader,Matlab,Matrix,Diagonal,Stringreader,在任何人提问之前,这是之前问题的转载,但我不能删除它,因为它有答案,所以我正在修改它,希望Daniel R能回答它 我有一个数字网格,我想在8个方向中的任意一个方向上读取带有strfind的字符串。我一直努力解决的非对角线问题,是我一直在努力解决的对角线问题(除了Daniel R之前帮助我解决的问题,我非常感谢) 代码如下: 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]

在任何人提问之前,这是之前问题的转载,但我不能删除它,因为它有答案,所以我正在修改它,希望Daniel R能回答它

我有一个数字网格,我想在8个方向中的任意一个方向上读取带有strfind的字符串。我一直努力解决的非对角线问题,是我一直在努力解决的对角线问题(除了Daniel R之前帮助我解决的
问题,我非常感谢)

代码如下:

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
完全可以
工作,但我不确定如何让其他人正常工作。需要注意的是,要测试每个方向,需要注释掉其他3个方向


谢谢。

一个针对我个人的问题,也许我必须写一个答案:)

我没有实现所有4个案例,而是编写了一个通用案例。正如您已经注意到的,4个案例可以使用
rot90
rot90(X,0)
不做任何操作)

为了获得索引,我创建了一个包含行数和列数的网格。只需将其通过与
rot90
diag
相同的过程,查看哪个索引被移动到该位置

最后,外部循环(
表示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

非常感谢。对不起,还有一个问题。我以前编写的方法允许我分别为每个方向计算rowOfLastNum和columnOfLastNum(我希望名称是不言自明的)(因为它是行/列递增或递减的组合)。如何使用常规代码实现这一点?我添加了一个空的switch case表达式。使用类似的方法来添加特定于一个方向的代码。太好了,谢谢你的帮助,我真的很感激。我能再问你一件事吗?这种文字搜索是从图像中读取的(整数是字母表位置),因此使用分类器对每个字母进行分类。分类器相当有效(约95%),但这意味着整个单词搜索中大约有10个字母是错误的。我做了一个函数,计算任意两个单词之间的编辑距离。如果一个单词的某些字母被错误地分类,我能用这个来计算出它的位置吗?