当需要索引位置时,在Matlab中更快地替代ismember?
我在Matlab中使用当需要索引位置时,在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); [~,
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正如我所说,我们同时回答了,我的反应是没有删除有效答案,因为我看到其他人也发布了一个