在matlab单元结构上进行矢量化滤波

时间:2014-09-11 15:49:31

标签: matlab vectorization

我有一个巨大的细胞载体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)保持在一起。我做了这个编辑,以防它有助于最后的重塑。

2 个答案:

答案 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循环。