假设你的字符串以连续运行的方式填充,并且该运行是您将看到特定唯一字符串的
唯一时间,您可以将其与
unique
和
accumarray
结合使用。首先,使用
unique
获取所有唯一字符串的列表,然后为每个字符串分配一个唯一ID,从1到您拥有的唯一字符串数量。
unique
的问题在于,只有当您
排序字符串时才会分配ID。因为您想要使用字符串的位置来确定其运行的起始和结束位置,所以您不想这样做。因此,您需要使用
'stable'
标志。您需要第一个输出以获取数组中的唯一字符串(供以后使用),以及第三个输出以获取此新ID分配:
strings = {'a'; 'a'; 'a'; 'a'; 'a'; 'a'; 'b'; 'b'; 'b'; 'b'; 'm'; 'm'; 'm'; 'm'};
[s,~,id] = unique(strings, 'stable');
现在您已经拥有了这个,使用accumarray
,以便您可以将每个ID分组在一起。 在这种情况下,您将要使用与每个唯一字符串相关联的位置号码,并且您将要将属于同一字符ID的所有位置号码进行分组。 一旦完成此操作,我们可以输出一个元素为两个元素向量的单元格数组,其中每个元素都给出每个运行的最小和最大位置。
out = accumarray(id, (1:numel(strings)).', [], @(x) {[min(x), max(x)]});
您可以将其显示在漂亮的表格中:
T = table(s, vertcat(out{:}), 'VariableNames', {'Letter', 'BeginEnd'});
我们得到:
T =
Letter BeginEnd
______ ________
'a' 1 6
'b' 7 10
'm' 11 14
然而,如果你想获取矩阵中的第一个和最后一个元素,只需执行以下操作:
ind = vertcat(out{:});
第一列给出每个字符的起始位置,第二列给出每个字符的结束位置。
strings = {'a','b','a','b'};
,那么我的输出将是什么? - rayryeng