区分Matlab中的空和非空regexp匹配

时间:2015-10-27 14:32:18

标签: matlab

我正在尝试匹配Matlab中的一些字符串并从匹配中创建一个新表。

变量txt包含:

  Columns 1 through 4

    'Time'    'LR1R2'    'LR1R2_SD'    'LR1R2_I'

  Columns 5 through 8

    'LR1R2_SD'    'R1'    'R1_SD'    'R1_I'

  Columns 9 through 12

    'R1_I_SD'    'R2'    'R2_SD'    'R2_I'

  Column 13

    'R2_I_SD'

我想在字符串

的末尾选择'_SD'的所有内容
pattern='_SD';
match=regexp(txt,pattern)

返回:

match = 

  Columns 1 through 8

    []    []    [6]    []    [6]    []    [3]    []

  Columns 9 through 13

    [5]    []    [3]    []    [5]

有人知道如何区分空的和非空的比赛吗?我的目标是从比赛中建立一个新桌子。这是我试过的

for i=match,
    ~isempty(i)
end

但这对一切都是真的。

由于

2 个答案:

答案 0 :(得分:3)

regexp函数返回一个单元格数组,其中每个单元格包含一个空数组(即[])或一个数字(例如[6])。要遍历此单元格数组的所有单元格,您可以使用cellfun函数并将isempty函数应用于每个单元格:

~cellfun(@isempty,match)

返回

ans =
     0     0     1     0     1     0     1     0     1     0     1     0     1

正如@Divakar正确评论,使用

~cellfun('isempty',match)

快得多。 当命令运行100'000次时,我测量了以下运行时间:

使用@isempty

Elapsed time is 0.757626 seconds.

使用'isempty'

Elapsed time is 0.118241 seconds.

请注意,此语法不适用于所有功能。来自cellfun上的MATLAB文档:

  

cellfun接受函数func的函数名字符串,而不是a   函数句柄,用于这些函数名称:isemptyislogicalisreal,   lengthndimsprodofsizesizeisclass。将函数名称括起来   单引号。

答案 1 :(得分:0)

我正在寻找的答案是:

for i=1:length(match),
    if ~isequal(match(i),{[]}),
        num(:,i)
    end
end

正如hbaderts所说,以下也是一种方法:

~cellfun(@isempty,match)