2

我有一个 20*3 单元格数组,我需要删除包含“137”、“2”和“n:T”的行

原产地数据:

'T'             ''          ''            
'NP(*)'         ''          ''            
[       137]    ''          ''            
[         2]    ''          ''            
'ARE'           'and'       'NP(FCC_A1#1)'
''              ''          '1:T'         
[      1200]    [0.7052]    ''            
[1.2051e+03]    [0.7076]    ''            
'ARE'           'and'       'NP(FCC_A1#3)'
''              ''          '2:T'         
[      1200]    [0.0673]    ''            
[1.2051e+03]    [0.0671]    ''            
'ARE'           'and'       'NP(M23C6)'   
''              ''          '3:T'         
[      1200]    [0.2275]    ''            
[1.2051e+03]    [0.2253]    ''            
[       137]    ''          ''            
[         2]    ''          ''    

我希望它像

'T'             ''          ''            
'NP(*)'         ''          ''                  
'ARE'           'and'       'NP(FCC_A1#1)'       
[      1200]    [0.7052]    ''            
[1.2051e+03]    [0.7076]    ''            
'ARE'           'and'       'NP(FCC_A1#3)'     
[      1200]    [0.0673]    ''            
[1.2051e+03]    [0.0671]    ''            
'ARE'           'and'       'NP(M23C6)'   
[      1200]    [0.2275]    ''            
[1.2051e+03]    [0.2253]    ''            

我已经尝试过 regexp 和 strcmp ,但它们效果不佳。加上单元阵列也很难处理。任何人都可以帮忙吗?

先感谢您。

4

3 回答 3

1

如果您可以以某种方式读取原始数据,以便所有单元格都是字符串或空数组(不是数值),您可以使用strcmpand来做到这一点regexprep

% The variable 'data' is a 2D-cell array of strings or empty arrays

datarep = regexprep(data,'^\d+:T','2'); % replace 'n:T' with '2' for convenience
remove1 = strcmp('2',datarep); % this takes care of '2' and 'n:T'
remove2 = strcmp('137',datarep); % this takes care of '137'
rows_keep = find(~sum(remove1|remove2,2)); % rows that will be kept
solution = data(rows_keep,:)

例如,有了这个data

'aa'     'bb'       'cc'  
'dd'     'dd'       '2'   
'137'    'dd'       'dd'  
'dd'     'dd'       '11:T'
'1:T'    '1:137'    'dd'  
'dd'     ''             []  

变量中的结果solution

'aa'    'bb'    'cc'
'dd'    ''        []
于 2013-08-08T01:53:12.260 回答
0

这是另一个简单的选择:

%Anonymous function that checks if a cell is equal to 173 or to 2 or fits the '*:T*' pattern
Eq137or2 = @(x) sum(x == 137 | x == 2) | sum(strfind(num2str(x), ':T') > 1)

%Use the anonymous functions to find the rows you don't want
mask = = sum(cellfun(Eq137or2, a),2)

%Remove the unwanted rows
a(~mask, :)
于 2013-08-08T10:41:19.877 回答
0

我刚刚在我的桌面上尝试了以下代码,它似乎可以解决问题。我制作a了您拥有的单元格阵列。

L = size(a, 1);
mask = false(L, 1);
for ii = 1:L
    if isnumeric(a{ii, 1}) && (a{ii, 1} == 137 || a{ii, 1} == 2)
        mask(ii) = true;
    elseif ~isempty(a{ii, 3}) && strcmp(a{ii, 3}(end-1:end), ':T')
        mask(ii) = true;
    end
end

b = a(~mask, :)

现在,b应该是您想要的单元格数组。基本上,我创建了一个逻辑掩码来指示满足规则的行的位置,然后使用它的倒数来调出行。

于 2013-08-07T23:18:33.473 回答