我正在尝试匹配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
但这对一切都是真的。
由于
答案 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 函数句柄,用于这些函数名称:isempty
,islogical
,isreal
,length
,ndims
,prodofsize
,size
,isclass
。将函数名称括起来 单引号。
答案 1 :(得分:0)
我正在寻找的答案是:
for i=1:length(match),
if ~isequal(match(i),{[]}),
num(:,i)
end
end
正如hbaderts所说,以下也是一种方法:
~cellfun(@isempty,match)