给出以下单元格数组:
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
)并确定开启和偏移的方式。然而,这种实现对我来说是“黑客”。
还有哪些其他方法可以有效地提取序列中的开启和偏移?
答案 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