我在Matlab中使用ismember
来查找向量A
中未包含在向量idx
中的整数。我想知道是否有更快的东西我可以使用。
关于我的问题,我找到了this answer,但它似乎在这里没有用,因为我需要索引位置。
rng default; %for reproducibility
A=randi([0 6],2097144,1); %2097144x1
idx=randi([0 6],4,1); %4x1
tic
% Find elements of idx not in A
[idx2,~,~]=unique(A);
[~,idx3]=ismember(idx,idx2);
idx4=idx(~idx3);
toc
Elapsed time is 0.278835 seconds.
答案 0 :(得分:4)
您可以使用setdiff
来查找第一个输入中第二个输入中不存在的元素。
result = setdiff(idx, A);
对于您提供的输入大小,我的执行时间提高了35倍。这可能是由于您使用unique(A)
这将导致成本高昂的事实,因为它必须对这个庞大的数组进行排序和处理。
作为旁注,tic
和toc
不是一种非常准确的代码基准测试方法。相反,您要使用timeit
。
function comparison()
A = randi([0, 6], 2097144, 1);
B = randi([0, 6], 4, 1);
disp(timeit(@()approach1(A, B)));
disp(timeit(@()approach2(A, B)));
end
function idx4 = approach1(A, B)
[idx2,~,~]=unique(A);
[~,idx3]=ismember(B, idx2);
idx4 = B(~idx3);
end
function res = approach2(A, B)
res = setdiff(B, A);
end
答案 1 :(得分:1)
您想使用setdiff
,请参阅documentation
C = setdiff(A,B)
会返回A
中不在B
内的数据,不会重复。C
按排序顺序排列。
你想要指数。进一步查看我们看到的文档
[C,ia] = setdiff(A,B)
也会返回索引向量ia
。
所以试试
A=randi([0 6],2097144,1);
idx=randi([0 6],4,1);
[~, idx2] = setdiff(A, idx);