2012-08-17 49 views
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_str1all_str2然後我會看看連續值(使用diff爲例),並確定方式上和偏移。然而,這種實現對我來說是'駭客'。

還有什麼其他方法可以有效地提取序列中的偏移和偏移?

回答

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

確定,但接下來,只要使用邏輯值和find找到上升/下降沿:

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 
+0

你能解釋一下'[true〜x(1:end-1)]'的部分嗎? – memyself 2012-08-17 17:33:40

+1

找到'x'中的位置從0到1的轉換,最初是'[0 x(1:end-1)] == false&x == true' (這是相同的)。你不能只用'x(1:end-1)== false&x(2:end)== true)',因爲那樣你會錯過'x(1)= true'的情況發病。 – 2012-08-17 17:37:30