Matlab关于函数的文档TF = contains(str,pattern)
指出:
如果 pattern 是一个包含多个模式的数组,则如果它在 str 中找到任何模式元素,则包含返回 1。
但是,我想要每个模式单独的结果。那是:
我有字符串A='a very long string'
和两种模式B='very'
和C='long'
。我想检查B
是否包含在A
中,以及C
是否包含在A
中。我可以这样做:
result = false(2,1);
result(1) = contains(A,B);
result(2) = contains(A,C);
但对于许多模式来说,这需要相当长的时间。做到这一点的快速方法是什么?
或无法访问该功能;它必须是"新的",所以我不知道它的特殊特性。
我会怎么做:
result = ~cellfun('isempty', regexp(A, {B C}));
艾迪特
从文档来看,您可以使用contains
做完全相同的事情:
result = contains(A, {B C});
除了这似乎返回contains(A,B) || contains(A,C)
而不是数组[contains(A,B) contains(A,C)]
。所以我不知道,我不能在这里测试它。但是,如果所有其他方法都失败了,您可以使用上面的regex
解决方案。
16b 中的新文本处理函数是最快的字符串。如果将 A 转换为字符串,您可能会看到更好的性能。
function profFunc
n = 1E6;
A = 'a very long string';
B = 'very';
C = 'long';
tic;
for i = 1:n
result(1) = contains(A,B);
result(2) = contains(A,C);
end
toc;
tic;
for i = 1:n
x = regexp(A, {B,C});
end
toc;
A = string(A);
tic;
for i = 1:n
result(1) = contains(A,B);
result(2) = contains(A,C);
end
toc;
end
>> profFunc
Elapsed time is 7.035145 seconds.
Elapsed time is 9.494433 seconds.
Elapsed time is 0.930393 seconds.
问题:B和C从何而来?你有很多硬编码变量吗?你能循环吗?循环可能是最快的。否则类似
cellfun(@(x)contains(A,x),{B C})
是一种选择。