考虑以下数组:
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,依此类推。
答案 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{:})