在Matlab中使用strfind获取矩阵中的不同对角线方向

时间:2013-12-12 18:45:03

标签: matlab matrix diagonal stringreader

在有人要求之前,这是一个早期问题的转贴,但我不能删除它,因为它有答案,所以我正在修改它以便希望Daniel R能够回答它!

我有一个数字网格,我想在8个方向中的任何一个方向读取一串带strfind的数字。非对角线的我已经设法工作正常,这是我一直在努力的对角线(除了{Daniel}之前Daniel R帮助我的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个。

谢谢。

1 个答案:

答案 0 :(得分:1)

一个个人对我说的问题,可能我必须写一个答案:)

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

为了获得索引,我创建了一个包含行和列数的网格。只需将其放在rot90diag的相同过程中,即可查看哪个索引已移至该位置。

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