Matlab是否具有类似于strfind的功能

时间:2013-12-05 17:07:41

标签: matlab matrix

但是如果String匹配,它不是只返回一个索引,而是根据单词的第一个字母返回搜索到的矩阵的元素?

例如,如果我有一个20乘20的整数矩阵并且包含在该矩阵中的是序列:3,34,6,7,8。并说如果我使用strfind与此矩阵并且正在搜索它相同的Ints字符串它将返回它开始的矩阵的列。但是我希望它也可以返回行。

我最初在想,因为我使用for循环来处理每一行,i的值将是行,但我正在努力实现它?

2 个答案:

答案 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

在接下来的步骤中,您需要fliplrflipudtranspose和我的回答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