细胞阵列细胞联合

时间:2014-05-23 18:10:07

标签: string matlab cell union

我正在寻找方法来完成字符串单元格数组的两个单元格数组的并集。例如:

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必须是字符串的单元格数组,除非一个是字符串。

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

替代方法:以字符串单元格数组的单元数组之外的任何其他方式获得单独字符串的单元格数组的方法也很有用,但据我所知,这是不可能的。

谢谢!

2 个答案:

答案 0 :(得分:2)

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 =匹配第一个wird,2 =匹配第二个字。最后,可以应用此数值矩阵unique来获取索引。

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

答案 1 :(得分:0)

Union似乎不兼容细胞的细胞阵列。因此,我们需要寻找一些解决方法。

一种方法是将A和B中的数据垂直连接起来。然后,沿每列为每个字符串单元分配一个唯一的ID。然后可以将这些ID组合成一个双数组,这样就可以使用带有'rows'选项的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'