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_str1andall_str2然后我会寻找连续的值(diff例如使用)并确定 on 和 offsets 的方式。然而,这种实现对我来说感觉很“骇人听闻”。

还有哪些其他方法可以有效地提取序列中的 on 和 offset?

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 回答