【问题标题】:Union of cell array of cells单元格数组的联合
【发布时间】:2014-07-13 04:53:12
【问题描述】:

我正在寻找合并两个元胞数组的字符串元胞数组的方法。例如:

A = {{'one' 'two'};{'three' 'four'};{'five' 'six'}};
B = {{'five' 'six'};{'seven' 'eight'};{'nine' 'ten'}};

我想得到类似的东西:

C = {{'one' 'two'};{'three' 'four'};{'five' 'six'};{'seven' 'eight'};{'nine' 'ten'}};

但是当我使用C = union(A, B) 时,MATLAB 返回错误:

类单元格的输入 A 和类单元格的输入 B 必须是字符串元胞数组,除非是字符串。

有谁知道如何以一种希望简单的方式做这样的事情?我将不胜感激。

替代方案:以字符串元胞数组的元胞数组以外的任何其他方式拥有一个分离字符串元胞数组的方法也是有用的,但据我所知,这是不可能的。

谢谢!

【问题讨论】:

  • 您可以使用 m-times-n 字符串元胞数组,而不是字符串元胞数组的元胞数组。如果所有行的列数都不相同(尽管在您的示例中它们有),则可以填充空字符串。使用 m-times-n 元胞数组也许可以简化您想要做的事情。更好的是每行使用一个字符串,由带有分隔符(保留字符)的单个字符串组成。然后你可以使用union
  • 我不得不修改我的其他函数才能像这样工作,但我认为这实际上是最好的解决方案!谢谢!我在实现 Daniel 的代码并意识到它认为 {'one' 'two'} 等于 {'two' 'one'} 后尝试了这个,这对我不起作用。

标签: string matlab cell union


【解决方案1】:
C=[A;B]    
allWords=unique([A{:};B{:}])
F=cell2mat(cellfun(@(x)(ismember(allWords,x{1})+2*ismember(allWords,x{2}))',C,'uni',false))
[~,uniqueindices,~]=unique(F,'rows')

C(sort(uniqueindices))

我的代码做了什么:它建立了一个所有单词allwords 的列表,然后这个列表用于建立一个矩阵,其中包含行之间的相关性以及它们包含的单词。 1=匹配第一个单词,2=匹配第二个单词。最后,可以在这个数字矩阵上应用unique 来获取索引。

包括我的更新,现在每个单元格的 2 个单词是硬编码的。为了摆脱这个限制,将匿名函数 (@(x)(ismember(allWords,x{1})+2*ismember(allWords,x{2}))) 替换为更通用的实现是必要的。可能又在用 cellfun 了。

【讨论】:

  • 这会很好用,但它认为 {'one' 'two'} 与 {'two' 'one'} 相同。很抱歉没有指定不应该发生这种情况。好主意,不过。
【解决方案2】:

Union 似乎与单元格数组不兼容。所以,我们需要寻找一些解决方法。

一种方法是将来自 A 和 B 的数据垂直连接起来。然后,沿着每一列为每个字符串单元格分配一个唯一的 ID。然后可以将这些 ID 组合成一个双精度数组,从而可以使用 unique 和“行”选项来获得所需的输出。这正是在这里实现的。

%// Slightly complicated input for safest verification of results
A = {{'three' 'four'};
    {'five' 'six'};
    {'five' 'seven'};
    {'one' 'two'}};

B = {{'seven' 'eight'};
    {'five' 'six'};
    {'nine' 'ten'};
    {'three' 'six'};};

t1 = [A ; B] %// concatenate all cells from A and B vertically
t2 = vertcat(t1{:}) %// Get all the cells of strings from A and B

t22 = mat2cell(t2,size(t2,1),ones(1,size(t2,2)));
[~,~,row_ind] = cellfun(@(x) unique(x,'stable'),t22,'uni',0)
mat1 = horzcat(row_ind{:})

[~,ind] = unique(mat1,'rows','stable')
out1 = t2(ind,:) %// output as a cell array of strings, used for verification too
out = mat2cell(out1, ones(1,size(out1,1)),size(out1,2)) %//desired output

输出 -

out1 = 
    'three'    'four' 
    'five'     'six'  
    'five'     'seven'
    'one'      'two'  
    'seven'    'eight'
    'nine'     'ten'  
    'three'    'six'  

【讨论】:

    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多