2

これは、以下に関連し ています。シーケンス内のゼロの島の検索

ただし、問題はまったく同じではありません。

比較のために、上記の投稿と同じベクトルを使用してみましょう。

sig = [1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0];

私が見つけようとしているのは、n個の連続するゼロの島の開始インデックスです。ただし、重複は許可されていません。たとえば、n = 2の場合、次の結果が必要です。v = [3、5、14、25];

Amroの解決策は(特にstrfindに関して)出発点として素晴らしいと思いましたが、彼の答えの2番目の部分では、私が期待する結果が得られません。これは私がこれまでに持っているベクトル化されていないソリューションです:

function v=findIslands(sig, n)
        % Finds indices of unique islands

        % sig       --> target vector
        % n         --> This is the length of the island

        % This will find the starting indices for all "islands" of ones
        % but it marks long strings multiple times
        startIndex = strfind(sig, zeros(1,n));

        L=length(startIndex);

        % ongoing gap counter
        spc=0;

        if L>0 % Check if empty
            v=startIndex(1);
            for i=2:L
                % Count the distance
                spc=spc+(startIndex(i)-startIndex(i-1));
                if spc>=n
                    v=[v,startIndex(i)];
                    % Reset odometer
                    spc=0;
                end
            end
        else
            v=[];
            display('No Islands Found!')
        end

私は誰かが上記の問題に対してより速いベクトル化された解決策を持っているかどうか疑問に思いました。

4

3 に答える 3

2

すべてを文字列に変換し、正規表現を使用できます。

regexp(sprintf('%d', sig(:)), sprintf('%d', zeros(n, 1)))

>> sig = [1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0];
>> n = 2;
>> regexp(sprintf('%d', sig(:)), sprintf('%d', zeros(n, 1)))

ans =
     3     5    14    25
于 2013-03-17T18:40:30.767 に答える
0

これを行う:

例として、必要なランレングスが2の場合を見てみましょう。

  1. ベクトルを2進数に変換する
  2. インデックスの設定=サイズ-1、開始の設定= []
  3. n<4までループします。
  4. nは4で割り切れますか?
  5. はい?開始にインデックスを追加します。n = n/4に設定
  6. いいえ?n = n/2に設定
  7. 後藤3

その他のランレングスの場合は、4を2**runに置き換えます。

于 2013-03-17T10:47:32.767 に答える
0

同じリンクされた質問からのgnoviceの答えを使用してください。それはベクトル化されており、duration == n必要な場所で実行されます。

https://stackoverflow.com/a/3274416/105904

で実行してduration >= nから、で除算durationするnと、各位置での連続実行の数と、インデックスリストを展開する方法がわかります。島の密度が高すぎない場合、これは正規表現バージョンよりも速くなる可能性があります。

于 2013-03-18T02:41:56.420 に答える