2

次のセル配列が与えられます:

strings = {'str1', 'str2', 'str2', 'str1', 'str2', 'str2', 'str1', 'str1', 'str2'};

特定の値の開始とオフセット(最初の発生と最後の発生)を見つけたい。たとえば、「str1」の開始とオフセットは次のとおりです。

onset_str1 = [1, 4, 7, ];
offset_str1 = [1, 4, 8, ];

そして、これが「str2」のオンとオフセットです。

onset_str2 = [2, 5, 9];
offset_str2 = [3, 6, 9];

現在、私は次のようなことをしています。

[blub, ia, ic] = unique(strings, 'first');
all_str1 = find(ic == 1); %  1     4     7     8
all_str2 = find(ic == 2); %  2     3     5     6     9

を使用all_str1して、次に(たとえばall_str2を使用して)連続する値を探し、その方法でオンとオフセットを決定します。diffしかし、この種の実装は私には「ハック」と感じます。

シーケンス内のオンとオフセットを効率的に抽出する他の方法はありますか?

4

1 に答える 1

1
[blub, ia, ic] = unique(strings, 'first');

わかりましたが、次は、ロジックを使用して、立ち上がり/立ち下がりエッジを見つけます

N = numel(blub); % number of unique strings found
str_onsets=cell(N,1);
str_offsets=cell(N,1);
for ii=1:N
    x=ic==ii;
    str_onsets{ii} = find([true ~x(1:end-1)] & x);
    str_offsets{ii}= find(x & [~x(2:end) true]);
end

または、それがあなたにとってより明確である場合はstrfind :

N = numel(blub); % number of unique strings found
str_onsets=cell(N,1);
str_offsets=cell(N,1);
for ii=1:N
    x=ic==ii;
    str_onsets{ii} = strfind([0 x],[0 1]);
    str_offsets{ii}= strfind([x 0],[1 0]);
end
于 2012-08-17T16:30:48.337 に答える