2017-01-13 6 views
2

MATLABの機能のドキュメントTF = contains(str,pattern)状態に対して別個結果で含まれていますパターンが複数のパターンを含む配列である場合は、STRパターンの任意の要素が見つかった場合は、複数のパターンの各々

、次いで戻る1を含んでいます。

私は個別しかし、各パターンに対する結果が欲しいです。 つまり、A='a very long string'と2つのパターンB='very'C='long'の2つのパターンを持っています。A='a very long string'です。私はBAに含まれており、C場合Aに含まれているかどうかを確認します。私はこれのようにすることができます:

result = false(2,1); 
result(1) = contains(A,B); 
result(2) = contains(A,C); 

しかし、これはかなりの時間がかかります。これを行うための速い方法は何ですか?

答えて

3

私が知っているか、その機能へのアクセスを持っていません。それは「新しい」ものでなければならないので、私はその特有の特異性を知らない。私はそれを行うだろうか

は次のとおりです。

result = ~cellfun('isempty', regexp(A, {B C})); 

EIDTthe documentationから判断

、あなたはcontainsとまったく同じことを行うことができます。

result = contains(A, {B C}); 

それがいるようだ除い配列[contains(A,B) contains(A,C)]ではなくcontains(A,B) || contains(A,C)を返します。だから私は知らない、私はここでそれをテストすることはできません。しかし、他のすべてが失敗した場合は、上記のregexソリューションを使用することができます。

+0

おかげで、正規表現式が動作しているようですし、呼び出し元に比べてかなり高速である複数回が含まれています。 – user1809923

+1

あなたがリンクしているドキュメントは混乱しますが、あなたが提案した使い方は実際に質問する方法では機能しないと思います: 'A'の各要素に対して' B'か'C'は、どちらがマッチしたかを教えてくれません。正規表現はより良い選択です。 – tmpearce

+0

@tmpearceはい、私は理解することは、あなたが言った、まさにあり、そして私は最後の段落に書いた - 単一の文字列のための 'A'それは与えられたパターンのいずれか*がで発見された*かどうかを表す単一の真/偽を返します。その文字列。奇妙な選択、それは私が通常遭遇するユースケースではない。しかたがない。 –

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

のようなものがオプションです。

関連する問題