找到数字序列的起始点(和偏移量)

时间:2012-08-17 15:30:47

标签: string matlab

给出以下单元格数组:

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 个答案:

答案 0 :(得分: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