如果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
?
答案 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