数组的“ismember”函数的有效替代 - MATLAB

时间:2014-11-04 13:52:23

标签: arrays performance matlab comparison cell-array

如果A是2D中的一系列点坐标,例如:

>> A = [1 2; 3 4; 5 6; 7 8; 9 0];
A =
     1     2
     3     4
     5     6
     7     8
     9     0

B包含两个单元格,每个单元格是A' A'并且仅用x值表示(第一列),表示:

>> B = {[3; 7];[5]}
B =
     [2x1 double]
     [     5    ]

我正在寻找一种解决方案,将B单元格搜索到A并提供这些点的坐标。

这是我的代码,对于大量数据来说非常慢:

C = cell (length(B) ,1)

for i = 1 : length(B)
     C{i} = A(ismember(A(:,1),B{i},'rows'),:);
end

C是正确的答案,包括2个单元格,它们是B每个单元格的坐标:

C = 
    [2x2 double]
    [1x2 double]

>> C{1}
ans =
     3     4
     7     8

>> C{2}
ans =
     5     6

同样,虽然C是正确答案,但我正在寻找更有效的解决方案。可能是cellfun

2 个答案:

答案 0 :(得分:1)

您不需要在'rows'使用ismember。所以,你可以这样做 -

for k = 1 : numel(B)
    C{i}=A(ismember(A(:,1),B{k}),:);
end

不确定这是否会加速您的解决方案。


作为第二种方法,这可能更快(虽然未经过测试),但您可以使用bsxfun -

for k = 1 : numel(B)
    C{k} = A(any(bsxfun(@eq,A(:,1),B{k}.'),2),:);
end

当然,在使用任何一种方法之前,请使用 -

pre-allocate
C = cell (numel(B) ,1)

答案 1 :(得分:1)

这是cellfun版本,虽然我怀疑它比循环更快(可能甚至稍慢):

>> C = cellfun(@(b) A(ismember(A(:,1),b),:), B, 'Uniform',false)
C = 
    [2x2 double]
    [1x2 double]

>> C{:}
ans =
     3     4
     7     8
ans =
     5     6