想象一下,你有两个单元格阵列
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
答案 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]