我有一个 channel 列表:
channels = {'1LT1', '1LT2', '1LT3', '1LT4', '1LT5', '2LA1', '2LA2', '2LA3', '3LH1', '3LH5', '4LT1', '4LT2', '4LT3', '5LH1', '5LH2', '4LT10'}
我需要编写一个算法来仅保留远端 channel 。这意味着对于每种类型的 channel (“1LT”、“2LA”、“3LH”、“4LT”等),我只需要最后编号最高的 channel 。最好的方法是返回这些 channel 的索引。例如,对于上述列表,结果应为:
[5, 8, 10, 15, 16]
我想我可以通过像这样的分割来使用正则表达式来做到这一点:
row_i = 1;
for ch_i=[1:length(channels)]
try
[n(row_i,:), ch_type(row_i,:)] = strsplit(channels{ch_i},'\d+[A-Z]', 'DelimiterType','RegularExpression');
row_i = row_i + 1;
catch
continue
end
end
但后来我真的陷入困境了。有人可以给我一些创建好的算法的技巧吗?
我很感谢您的任何想法!
最佳答案
您可以使用regexp
要将每个字符串分解为 channel 和数字,请使用 findgroups
为 channel 创建数字标签,将数字字符串转换为实际数字 str2double
,然后 splitapply
找到每组的最大值。这是代码,尽管我现在无法测试它,因此可能需要一些调整:
tokens = regexp(channels, '(\d+[A-Z]+)(\d+)', 'tokens');
tokens = vertcat(tokens{:});
[grps, channelID] = findgroups(tokens(:, 1));
nums = str2double(tokens(:, 2));
channelMax = splitapply(@max, nums, grps);
使用 channelID
和 channelMax
值,您可以重建远端 channel 名称并使用 sprintf
在 channel 列表中查找它们的索引。 , strsplit
,和 ismember
:
distal = strsplit(sprintf('%s%d\n', channelID, channelMax));
index = find(ismember(channels, distal));
关于regex - Matlab 中的正则表达式仅保留数组中的指定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59182506/