但是如果String匹配,它不是只返回一个索引,而是根据单词的第一个字母返回搜索到的矩阵的元素?
例如,如果我有一个20乘20的整数矩阵并且包含在该矩阵中的是序列:3,34,6,7,8。并说如果我使用strfind与此矩阵并且正在搜索它相同的Ints字符串它将返回它开始的矩阵的列。但是我希望它也可以返回行。
我最初在想,因为我使用for循环来处理每一行,i的值将是行,但我正在努力实现它?
答案 0 :(得分:1)
做一些数学。 strfind
需要单行向量,您可以使用冒号运算符:
轻松实现 - 然后使用该位置来计算行和列索引。
示例数据:
A = char('a'+ randi(26,5,5) -1)
A =
ftyqa
foxuk
iijtt
cvodu
tojvj
现在看一下'x'
的位置:
[m,n] = size(A);
pos = strfind(A(:)','x');
column = ceil(pos/m);
row = mod(pos-1,m)+1;
column =
3
row =
2
另请查看regexpi
,也许有用,因为它还会返回最后一个字母的索引。
[start,end] = regexpi(A(:)','myWord')
希望结束这个wordsearch算法疯狂,试试这个家伙:
首先将您的char矩阵转换为1 to 26
的整数,以及您实际需要的单词。
示例:
A = reshape(1:25,5,5)'
A =
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
[m,n] = size(A)
序列,无论如何:
sequence = [8 9 10];
[~,I] = intersect(A,sequence)
序列索引:
I = 8 9 10
最后检查它实际上是否是一个有效的序列:
dI = diff(sort(I))
validSequence = ( numel(sequence) == sum(dI)+1 ...
&& numel(sequence) <= mod(I(end)-1,m)+1 )
validSequence = 1
其他案件将是:
sequence = [13 10 11];
validSequence = 0 %violates 1st condition
sequence = [9 10 11];
validSequence = 0 %violates 2nd condition
在接下来的步骤中,您需要fliplr
,flipud
,transpose
和我的回答here才能完成算法。
答案 1 :(得分:0)
thewaywewalk的答案看起来更优雅,但您也可以使用strfind
将单元格数组作为第一个参数。只需通过mat2cell
将矩阵转换为单元格数组,其中每个单元格都是矩阵中的一行。
数据:
M = randi(25,20,20);
s = M(sub2ind(size(M),[4 4 4],[3 4 5])); % sequence at row 4, columns 3 to 5
搜索:
>> c = mat2cell(char(M),ones(size(M,1),1),size(M,2));
>> matches = strfind(c,char(s));
>> row = find(~cellfun(@isempty,matches))
row =
4
>> col = matches{row}
col =
3