MATLAB在细胞阵列中搜索



设置:

我有一个21 x 3的细胞阵列。

前2列通常是字符串或字符数组,但可以是1xn个字符串或字符阵列单元(如果在我的脚本上下文中有多个意思相同的备用字符串(。第三个元素是一个数字。

我希望在第1列中返回包含在该单元格数组中的字符串或字符数组(但类型不必匹配(的任何EXACT匹配的索引,如果第1列不匹配,则返回第2列。

我可以使用以下内容:

find(strcmp( 'example', celllist(:,1) ))

find(strcmp( 'example', celllist(:,2) ))

这些索引将与顶级单元格数组中的任何字符串/字符数组匹配相应的索引。当然,这不会匹配顶级单元格数组中字符串的单元格中的任何字符串。

有没有一种优雅的方式来匹配这些字符串(即,不使用for、while或类似的循环(?如果单元格包含匹配项,或者单元格中的单元格在其任意单元格中包含完全匹配项,我希望它返回主单元格数组的索引(1到21(。

cellstr函数是您的朋友,因为它将以下所有内容转换为字符的单元格数组:

  • 字符,例如cellstr( 'abc' ) => {'abc'}
  • 字符单元,例如cellstr( {'abc','def'} ) => {'abc','def'}
  • 字符串,例如cellstr( "abc" ) => {'abc'}
  • 字符串数组,例如cellstr( ["abc", "def"] ) => {'abc','def'}

然后您不必关心变量类型,只需对每个元素进行ismember检查,我们可以假设它是一个字符单元。

我们可以设置一个测试:

testStr = 'example';
arr = { 'abc', 'def', {'example','ghi'}, "jkl", "example" };
% Expected output is [0,0,1,0,1]

通过一个循环来更好地理解逻辑,如下所示:

isMatch = false(1,numel(arr)); % initialise output
for ii = 1:numel(arr)          % loop over main array
x = cellstr(arr{ii});      % convert to cellstr
isMatch(ii) = any( ismember( testStr, x ) ); % check if any sub-element is match
end

如果你想避免循环*,那么你可以使用cellfun来完成这一行

isMatch = cellfun( @(x) any( ismember( testStr, cellstr(x) ) ), arr );
% >> isMatch = [0 0 1 0 1]

因此,对于您的情况,您可以在两列上运行此操作,并应用一些简单的逻辑来选择您想要的

isMatchCol1 = cellfun( @(x) any( ismember( testStr, cellstr(x) ) ), arr(:,1) );
isMatchCol2 = cellfun( @(x) any( ismember( testStr, cellstr(x) ) ), arr(:,2) );

如果需要行索引而不是逻辑数组,则可以使用find函数(即isMatchIdx = find(isMatch);(包装输出。


*这只是在视觉上避免了循环,cellfun基本上是一个伪装的循环设备,但它至少可以节省我们初始化输出的时间。

最新更新