查找数字和字符串

时间:2017-01-25 00:24:16

标签: matlab

我有一个由数字,字符串和空数组组成的单元格数组。我想找到包含一个字符串的所有单元格的位置(线性或索引),其中出现一个感兴趣的子字符串。

mixedCellArray = {
   'adpo' 2134  []
   0 [] 'daesad'
   'xxxxx' 'dp' 'dpdpd'
}

如果感兴趣的子串是'dp',那么我应该得到三个单元格的索引。

当单元格数组只包含字符串时,我能找到的唯一解决方案是:

一种解决方法是找到所有不包含字符串的单元格,并用'{填充',如this posting暗示的那样。不幸的是,我的方法需要改变该解决方案,可能类似于cellfun('ischar',mixedCellArray)。这会导致错误:

Error using cellfun
Unknown option. 

感谢您提供有关如何找出错误的任何建议。

我已将此内容发布到usenet

教育AFTERNOTE:对于那些在家里没有Matlab的人,最终在Matlab和Octave之间来回弹跳。我在上面问过为什么cellfun不接受'ischar'作为其第一个参数。答案结果是参数必须是Matlab中的函数句柄,所以你真的需要传递@ischar。为了向后兼容,有些函数的名称可以作为字符串传递,但ischar不是其中之一。

4 个答案:

答案 0 :(得分:4)

只需使用循环,使用ischarcontains进行测试(在R2016b中添加)。各种*fun基本上都是循环,一般来说,与显式循环相比,它没有任何性能优势。

mixedCellArray = {'adpo' 2134  []; 0 [] 'daesad'; 'xxxxx' 'dp' 'dpdpd'};
querystr = 'dp';

test = false(size(mixedCellArray));
for ii = 1:numel(mixedCellArray)
    if ischar(mixedCellArray{ii})
        test(ii) = contains(mixedCellArray{ii}, querystr);
    end
end

返回:

test =

  3×3 logical array

   1   0   0
   0   0   0
   0   1   1

编辑:

如果您没有contains的MATLAB版本,则可以替换regex

test(ii) = ~isempty(regexp(mixedCellArray{ii}, querystr, 'once'));

答案 1 :(得分:4)

这个单行怎么样:

>> mixedCellArray = {'adpo' 2134  []; 0 [] 'daesad'; 'xxxxx' 'dp' 'dpdpd'};
>> index = cellfun(@(c) ischar(c) && ~isempty(strfind(c, 'dp')), mixedCellArray)

index =

  3×3 logical array

   1   0   0
   0   0   0
   0   1   1

可以在没有ischar(c) && ...的情况下通过,但您可能希望将其保留在那里,因为strfind会将任何数值/数组隐式转换为等效的ASCII字符做比较。这意味着你可能会得到误报,如下例所示:

>> C = {65, 'A'; 'BAD' [66 65 68]}  % Note there's a vector in there

C =

  2×2 cell array

    [ 65]    'A'         
    'BAD'    [1×3 double]

>> index = cellfun(@(c) ~isempty(strfind(c, 'A')), C)  % Removed ischar(c) &&

index =

  2×2 logical array

   1   1                % They all match!
   1   1

答案 2 :(得分:2)

z=cellfun(@(x)strfind(x,'dp'),mixedCellArray,'un',0);
idx=cellfun(@(x)x>0,z,'un',0);
find(~cellfun(@isempty,idx))

答案 3 :(得分:0)

以下是我原帖中的usenet链接的解决方案:

>> mixedCellArray = {
         'adpo' 2134  []
         0 [] 'daesad'
         'xxxxx' 'dp' 'dpdpd'
      }

mixedCellArray =
    'adpo'     [2134]          []
    [    0]        []    'daesad'
    'xxxxx'    'dp'      'dpdpd'

>> ~cellfun( @isempty , ...
             cellfun( @(x)strfind(x,'dp') , ...
                      mixedCellArray , ...
                      'uniform',0) ...
           )

ans =
     1     0     0
     0     0     0
     0     1     1

内部cellfun能够将strfind应用于偶数数字单元格,因为我认为,Matlab以相同的方式处理数值数组和字符串。字符串只是表示字符代码的数字数组。外cellfun标识内部cellfun找到匹配的所有单元格,并且前缀tilde将其转换为所有没有匹配的单元格。

感谢dpb。