【问题标题】:Removing duplicate strings from a nested cell array从嵌套元胞数组中删除重复字符串
【发布时间】:2021-05-19 03:31:38
【问题描述】:

我有一个名为 tmp 的 1x234 元胞数组,我想从中删除所有重复项。 tmp 的一些元素可以是:

tmp{1, 3} -> 'Ro'
tmp{1, 167}{1, 1} -> 'Ro'
tmp{1, 167}{1, 2} -> 'CvF'

在前两个中,我只想保留tmp{1, 167}{1, 1} -> 'Ro'

另外,我想把包含cells-within-cells的条目,比如:

tmp{1, 167}{1, 1} -> 'Ro'
tmp{1, 167}{1, 2} -> 'CvF'

进入:

tmp{1, 167}-> 'Ro'
tmp{1, 168}-> 'CvF'

我怎样才能实现这两个目标?

【问题讨论】:

  • 有可能,是的。但是,确切的实现取决于您的数据结构,特别是嵌套的深度,是否仅包含单元格等。它还取决于您的解决方案需要的效率。如果您的所有数据都是嵌套在未知深度的单元格中的字符向量,您可以创建一个字符串向量并迭代地+递归地“拆箱”您的单元格数组并将条目分配给这个向量。一旦你的数据结构被展平,删除重复就很简单了(使用unique)。
  • 感谢您的回答。很难理解你的意思。它的嵌套并不深。最深的级别是我之前发布的级别。 tmp{1, 167}{1, 1} -> 'Ro' tmp{1, 167}{1, 2} -> 'CvF' 数组的内容只是字母。

标签: string matlab duplicates cell-array flatten


【解决方案1】:

TL;DR: unq = unique([tmp{:}]);


如果您的最大嵌套级别为 2(即单元格中的单元格),则展平数组不需要任何类型的递归函数,并且可以使用简单的串联来实现。请参阅下面的完整示例:

function unq = q66221704()
%% Generate some data:
rng(66221704); % for reproducibility
N = 2;
tmp = cell(1,234);
for k = 1:numel(tmp)
  if rand(1) < 0.6 % create nested cells with some probability
    tmp{k} = getLowercaseString(N);
  else
    tmp{k} = {getLowercaseString(N), getLowercaseString(N)};
  end
end

%% Flatten cell array:
new = [tmp{:}]; % size = 1x352

%% Keep uniques:
unq = unique(new); % size = 1x259
end

function c = getLowercaseString(nChars)
c = char(randi([97, 122], [1, nChars]));
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 2014-06-04
    • 2015-04-23
    相关资源
    最近更新 更多