使用find功能

时间:2014-02-11 17:58:57

标签: matlab

考虑以下数组:

A = [1 3 4 5 6 7 1 3 7];
B = [1 4 7];

我想在数组B中找到A的所有元素。所以,我的最终输出数组看起来像是:

C = [1 7 3 6 9];

B的第一个元素位于数组A中的位置1和7,因此C有1和7作为前两个元素。 B的元素4位于位置3,因此数组C的第三个元素为3,依此类推。

3 个答案:

答案 0 :(得分:4)

C的顺序是必需的吗?

快,但另一个订单:

find(ismember(A,B))

较慢,但你想要的顺序:

cell2mat(arrayfun(@(x)(find(A==x)),B,'UniformOutput',false))

基本上,第二个解决方案迭代B的所有元素并在循环中应用find(A==x)

您也可以删除cell2mat,然后返回一个单元格。第一个元素 - > 1,第二元素的出现 - >发生4等。

答案 1 :(得分:2)

如果您需要该顺序的结果:您可以使用ismember的两个输出。这可能比Daniel's answer (second part)更快,因为它避免了arrayfun

[tf, loc] = ismember(A,B);
loc = loc(tf);
ind = find(tf);
[~, order] = sort(loc);
C = ind(order);

答案 2 :(得分:1)

ismember的第二个输出会为B

的每个元素提供一个地图
>> [~,ic] = ismember(A,B)
ic =
     1     0     2     0     0     3     1     0     3

然后对B的每个元素进行逐元素测试:

>> [C,~] = find(bsxfun(@eq,ic.',1:numel(B)))
C =
     1
     7
     3
     6
     9

因为我需要这样做,所以ismember之后的另一种方法是:

c = accumarray(nonzeros(ic),find(ic),[],@(x) {sort(x)});
C = vertcat(c{:})