在矩阵中使用strfind在矩阵中的不同对角线方向
问题描述:
在任何人问起之前,这是前一个问题的转贴,但我不能删除它,因为它有答案,所以我正在修改它,以便Daniel R有希望回答它!在矩阵中使用strfind在矩阵中的不同对角线方向
我有一个数字网格,我想在8个方向中的任何一个方向上读strfind
的一串数字。非对角线的我已经设法正常工作,这是我一直在努力的对角线(除了丹尼尔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个需要注释掉。
谢谢。
答
一个问题亲自解决了我,可能是我必须写一个答案:)
无需实现所有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
谢谢。虽然抱歉,还有一个问题。我之前编写它的方式允许我为每个方向分别计算rowOfLastNum和columnOfLastNum(我希望名称是自解释的),因为它是行/列的增加或减少的组合。我如何用通用代码实现这一点? – user3094936
我添加了一个空的开关箱表达式。使用与此相似的内容来添加特定于某个方向的代码。 – Daniel
非常感谢您的帮助,我非常感谢。我可以再问你一件事吗?这个词搜索是从图像中读取的(整数是字母位置),因此使用分类器对每个字母进行分类。分类器效率很高(大约95%),但是这意味着在整个文字搜索中大约有10个字母是错误的。我有一个函数可以计算任意两个单词之间的编辑距离。有没有一种方法可以用它来确定一个单词在某些字母被误分类时的位置? – user3094936