matlab尽可能快地找到包含另一个单元阵列中每个字符串的所有单元格

时间:2017-04-10 10:35:26

标签: arrays string matlab cell

想象一下,你有两个单元格阵列

A={'a','b','b','c','d','e'} B={'a','b','c','d','e','f'}

并且您希望(尽可能快地)获取共享元素索引的单元格

e.g。

{1,2,2,3,4,5} B中的索引,用于A

的元素

{1,[2,3],4,5,6,[]} A中的索引为B

的元素 你会怎么做?

2 个答案:

答案 0 :(得分:1)

这是我将如何做到的:

A = {'a','b','b','c','d','e'};
B = {'a','b','c','d','e','f'};
[~, ~, lab] = unique([A B]); % unique integer labels of elements in A and B
labA = lab(1:numel(A)); % this is A with each string replaced by its label
labB = lab(numel(A)+1:end); % this is B with each string replaced by its label
comp = bsxfun(@eq, labA(:), labB(:).'); % all pair-wise comparisons 
[ii, jj] = find(comp); % row and column indices of the matchings
result_AinB = accumarray(ii, jj, [numel(A) 1], @(x){sort(x(:).')}); % group jj by ii
result_BinA = accumarray(jj, ii, [numel(B) 1], @(x){sort(x(:).')}); % group ii by jj

这给出了

>> celldisp(result_AinB)
result_AinB{1} =
     1
result_AinB{2} =
     2
result_AinB{3} =
     2
result_AinB{4} =
     3
result_AinB{5} =
     4
result_AinB{6} =
     5

>> celldisp(result_BinA)
result_BinA{1} =
     1
result_BinA{2} =
     2     3
result_BinA{3} =
     4
result_BinA{4} =
     5
result_BinA{5} =
     6
result_BinA{6} =
     []

答案 1 :(得分:0)

我个人会用

[c,ia,ib]=union(A,B)

[c,ia,ib]=intersect(A,B)

并处理这些结果的索引。但是,这并没有按照您要求的格式提供输出,因为它没有列出重复项

ia = [1 2 3 4 5]

因此,要以您要求的格式获取它,请使用 ismember 两次。

Trial>> [~,ia]=ismember(A,B)

ia =

     1     2     2     3     4     5

Trial>> [~,ib]=ismember(B,A)

ib =

     1     2     4     5     6     0

这就是为什么我会使用union或intersect,因为你可以从一次调用中获得所有必需的数据。

如果你想要那种特定的格式,那么这应该有效

ia=cellfun(@(x) find(strcmp(x,A)),B,'UniformOutput',false)
ib=cellfun(@(x) find(strcmp(x,B)),A,'UniformOutput',false)


ia =
  1×6 cell array
    [1]    [1×2 double]    [4]    [5]    [6]    [1×0 double]

ib =    
  1×6 cell array
    [1]    [2]    [2]    [3]    [4]    [5]