假设您的字符串是以连续运行字符串的方式填充的,并且该运行是唯一一次您会看到特定的唯一字符串,您可以将其与 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{:});
第一列给出每个字符的起始位置,第二列给出每个字符的结束位置。