包含多个模式中的每个模式的单独结果

时间:2017-01-13 12:33:42

标签: string matlab

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);

但对于许多模式,这需要相当长的时间。快速的方法是什么?

2 个答案:

答案 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}) 

是一个选项。