当需要索引位置时,在Matlab中更快地替代ismember?

当需要索引位置时,在Matlab中更快地替代ismember?,matlab,Matlab,我在Matlab中使用ismember查找向量A中未包含在向量idx中的整数。我想知道是否有更快的我可以使用 关于我的问题,我发现了,但它在这里似乎不起作用,因为我需要指数位置 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); [~,

我在Matlab中使用
ismember
查找向量
A
中未包含在向量
idx
中的整数。我想知道是否有更快的我可以使用

关于我的问题,我发现了,但它在这里似乎不起作用,因为我需要指数位置

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.
您可以改为使用,它将查找第一个输入中不存在于第二个输入中的元素

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

要使用
setdiff
,请参阅

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);

实际问题中的值范围是否如此小(0:6)?您是否分析了您的代码,以确定它是
ismember
还是
唯一的
,占用的时间最多?你有没有测试过其他方法?这与现有答案有什么区别?@excaza非常少,Suever在我写我的答案时回答,所以我没有看到,注意只有3分钟的差异。另外,他的原始答案没有代码示例或文档链接,因此我将我的答案保留在原地,以防有用。他的原始问题@excaza正如我所说,我们同时回答了,我的反应是没有删除有效答案,因为我看到其他人也发布了一个