Matlab关于函数TF = contains(str,pattern)
的文档说明:
如果pattern是包含多个模式的数组,则如果在str中找到pattern的任何元素,则contains返回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);
但对于许多模式,这需要相当长的时间。快速的方法是什么?
答案 0 :(得分:3)
我不知道或无法访问该功能;它必须是“新的”,所以我不知道它的特殊特质。
我将如何做到:
result = ~cellfun('isempty', regexp(A, {B C}));
EIDT
从the documentation判断,您可以使用contains
执行完全相同的操作:
result = contains(A, {B C});
除了似乎返回contains(A,B) || contains(A,C)
而不是数组[contains(A,B) contains(A,C)]
。所以我不知道,我不能在这里测试它。但如果所有其他方法都失败了,您可以使用上面的regex
解决方案。
答案 1 :(得分:0)
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})
是一个选项。