我有一个由数字,字符串和空数组组成的单元格数组。我想找到包含一个字符串的所有单元格的位置(线性或索引),其中出现一个感兴趣的子字符串。
mixedCellArray = {
'adpo' 2134 []
0 [] 'daesad'
'xxxxx' 'dp' 'dpdpd'
}
如果感兴趣的子串是'dp',那么我应该得到三个单元格的索引。
当单元格数组只包含字符串时,我能找到的唯一解决方案是:
http://www.mathworks.com/matlabcentral/answers/2015-find-index-of-cells-containing-my-string
http://www.mathworks.com/matlabcentral/newsreader/view_thread/255090
一种解决方法是找到所有不包含字符串的单元格,并用'{填充',如this posting暗示的那样。不幸的是,我的方法需要改变该解决方案,可能类似于cellfun('ischar',mixedCellArray)
。这会导致错误:
Error using cellfun
Unknown option.
感谢您提供有关如何找出错误的任何建议。
我已将此内容发布到usenet
教育AFTERNOTE:对于那些在家里没有Matlab的人,最终在Matlab和Octave之间来回弹跳。我在上面问过为什么cellfun
不接受'ischar'
作为其第一个参数。答案结果是参数必须是Matlab中的函数句柄,所以你真的需要传递@ischar
。为了向后兼容,有些函数的名称可以作为字符串传递,但ischar
不是其中之一。
答案 0 :(得分:4)
只需使用循环,使用ischar
和contains
进行测试(在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。