删除仅包含特定值的重复连续单元格(MATLAB)

时间:2016-03-21 21:34:21

标签: matlab

我有一个非常具体的事情,我需要Matlab来做,而且我不确定该如何去做。

以下是我正在使用的示例:

'B4,9(55)'
'B4,9(55)'
'B2,16,25(99)'
'B2,16,25(99)'
'B17,21,28,29(46)'
'B4,10(56)'
'B4,10(56)'
'B2,15,25(99)'
'B17,20,27,29(45)'

我需要一个删除连续重复条目的脚本,但如果包含某个字符串(即52,55和56),则只需要 。不应删除带(99)的重复条目。所以,我想要最终得到的是:

'B4,9(55)'
'B2,16,25(99)'
'B2,16,25(99)'
'B17,21,28,29(46)'
'B4,10(56)'
'B2,15,25(99)'
'B17,20,27,29(45)'

这可能吗?

编辑:一些更大的背景...... 我在EEG实验室工作,我们使用Matlab分析我们的数据。打开Matlab后,我运行'eeglab'。然后我打开一个设置文件。我运行一个脚本来创建一个EEG事件列表,并删除我不想要的某些事件类型。

%create a list of events
justevents = {EEG.event.type};

%delete the 201-203s
justevents(strcmp(justevents,'201'))=[];
justevents(strcmp(justevents,'202'))=[];
justevents(strcmp(justevents,'203'))=[];

%delete the 101-130s
justevents(strcmp(justevents,'101'))=[];
justevents(strcmp(justevents,'102'))=[];
justevents(strcmp(justevents,'103'))=[];
justevents(strcmp(justevents,'104'))=[];
justevents(strcmp(justevents,'105'))=[];

(这一直到130)

然后我运行了Suever给我的代码,但它删除了52,55和56个事件......

这是一个更大的示例数据块,包括上面包含的代码中删除的内容。我不确定如何正确格式化,但这是Matlab输出...

mycell = { ...

'B1,12,25(99)'    '201'    '101'    'B18,23,27,29(45)'    'B3,6(55)' ...
'B3,6(55)'    'B2,16,25(99)'    '201'    '102'    'B17,21,28,29(46)' ...
'B4,10(56)'    'B4,10(56)'    'B1,13,25(99)'    '201'    '201'    '103' ...
'B18,24,28,29(46)'    'B3,7(56)'    'B3,7(56)'    'B2,14,25(99)'    '201' ...
'104'    'B17,19,26,29(42)'    'B4,8(52)'    'B4,8(52)'    'B1,13,25(99)' ...
'201'    '105'    'B18,24,28,29(46)'    'B3,7(56)'}

2 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是首先找到所有重复的字符串并为每个唯一字符串分配索引。您可以使用ismember的第二个输出轻松完成此操作。

[~, unique_ind] = ismember(mycell, mycell);

然后,我们可以通过查找具有相同索引值系列的位置来识别连续重复项。我们可以通过查看差异是否为零来检查这一点。

consec_dupes = [false, diff(unique_ind) == 0];

然后我们可以查看每个具有重复值的情况,并通过使用正则表达式查看它们是否符合条件。如果在字符串中找到53,55或56,则truefalse,否则为ismatch = ~cellfun(@isempty, regexp(mycell(consec_dupes), '\(52|55|56\)'));

consec_dupes

现在我们要忽略与指定数字不匹配的所有连续重复项。为此,我们现在可以将没有&#em>匹配的false值设置为consec_dupes(consec_dupes) = ismatch;

mycell(consec_dupes) = [];

现在我们只删除与原始单元格数组匹配的连续重复项。

[~, unique_ind] = ismember(mycell, mycell);
consec_dupes = [false, diff(unique_ind) == 0];
ismatch = ~cellfun(@isempty, regexp(mycell(consec_dupes), '\(52|55|56\)'));
consec_dupes(consec_dupes) = ismatch;
mycell(consec_dupes) = [];

摘要

所以将所有这些整合到一个代码块中:

'B1,12,25(99)'
'201'
'101'
'B18,23,27,29(45)'
'B3,6(55)'
'B2,16,25(99)'
'201'
'102'
'B17,21,28,29(46)'
'B4,10(56)'
'B1,13,25(99)'
'201'
'201'
'103'
'B18,24,28,29(46)'
'B3,7(56)'
'B2,14,25(99)'
'201'
'104'
'B17,19,26,29(42)'
'B4,8(52)'
'B1,13,25(99)'
'201'
'105'
'B18,24,28,29(46)'
'B3,7(56)'

将此应用于您的示例数据,我们得到以下信息:

help('modules')

答案 1 :(得分:0)

首先,您必须将字符串放在单元格中。

cell = {'B4,9(55)',
'B4,9(55)',
'B2,16,25(99)',
'B2,16,25(99)',
'B17,21,28,29(46)',
'B4,10(56)',
'B4,10(56)',
'B2,15,25(99)',
'B17,20,27,29(45)'};

然后,这只是一个选项,您可以通过组合两个索引来选择数据。

[~,index1] = unique(cell); %find the uniques strings.
index2 = find(cellfun(@isempty,strfind(cell,'99'))==0); %find the string that contains '99'
index = unique([index1;index2]);

mycell = cell(sort(index))