我有一个巨大的细胞载体cc(大小:1xN)形式:
cc{1} = {'indexString1', 'str_row1col1', 'str_row1col2' }
cc{2} = {'indexString2', 'str_row2col1', 'bighello', 'str_row1col3' }
cc{3} = {'indexString3','str_row3col1'}
cc{4} = {'indexString4','str_row3col1', 'helloWorld'}
我想遍历每个单元格并删除包含单词“hello”的特定单元格,例如c{4}{2}
。我们可以在没有for循环保持cc
的最终结构的情况下这样做吗?
最佳, 透特
编辑:从我看到的答案和评论中,单元格的结构带来了一些限制。因此欢迎存储我的数据的任何其他建议。我只想将对应于相同indexString * n *(例如'str_row1col1', 'str_row1col2'
)的所有单元格(例如indexString1
)保持在一起。我做了这个编辑,以防它有助于最后的重塑。
答案 0 :(得分:2)
使用正则表达式,您可以获得一个逻辑数组,其中零表示单词' hello'的出现。嵌套单元格中的某个位置。正如@LuisMendo指出的那样,如果没有嵌套不需要的单元格,这将更容易删除:
clc
clear
cc{1} = {'str_row1col1', 'str_row1col2' };
cc{2} = {'str_row2col1', 'bighello', 'str_row1col3' };
cc{3} = {'str_row3col1'};
cc{4} = {'str_row3col1', 'helloWorld'};
A = (cellfun(@isempty,regexp([cc{:}],'(\w*hello|hello\w*)','match')))
提供以下数组:
A =
1 1 1 0 1 1 1 0
对于其余的我认为你需要一个循环,因为嵌套的单元格大小不同。无论如何,我希望它对你有所帮助。
编辑以下是使用for循环可以执行的操作。为了识别感兴趣的词(地球和水,如下面的评论),只需将它们添加到regexp调用中的参数中。这个角色:|用于制作某种列表,以便Matlab检查括号中的所有表达式。
有关正则表达式的更多信息,请参阅this页面。还可以查找具有区分大小写的正则表达式。
示例代码,其中我添加了包含地球和水的字符串:
cc{1} = {'str_row1col1', 'earth!superman' 'str_row1col2' 'DummyString'};
cc{2} = {'str_row2col1', 'bighello', 'str_row1col3' };
cc{3} = {'str_row3col1' 'str_row3col3' 'water_batman'};
cc{4} = {'str_row3col1' 'str_row4col2' 'helloWorld'};
cc{5} = {'str_row5_LegoMan' 'str_row5col2' 'AnotherDummyString' 'Useless String' 'BonjourWorld'};
% With a for loop, for example:
FinalCell = cell(size(cc,2),1);
for k = 1:size(cc,2)
DummyCell = cc{k}; % Use dummy cell for easier indexing
% This is where you tell Matlab what words/expressions you are looking for
A = cellfun(@isempty,regexp(cc{k},'(\w*hello|hello\w*|earth|water)','match'));
DummyCell(~A) = []; % Remove the cells containing the strings/words of interest
FinalCell{k} = DummyCell;
end
然后你很高兴去。希望有所帮助!
答案 1 :(得分:0)
我发现最接近的是:
clear all
cc{1} = {'str_row1col1', 'str_row1col2' };
cc{2} = {'str_row2col1', 'bighello', 'str_row1col3' };
cc{3} = {'str_row3col1'};
cc{4} = {'str_row3col1', 'helloWorld'};
cc1 = [cc{:}];
cc1 = cc1(~strcmp('bighello',cc1));
这会将您的数组重新组织成一维数组,它不能匹配正则表达式,只能匹配整个单词 为了更好的工作,我担心你必须使用for循环。