当需要索引位置时,在Matlab中更快地替换成员?

时间:2017-03-22 15:04:55

标签: matlab

我在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.

2 个答案:

答案 0 :(得分:4)

您可以使用setdiff来查找第一个输入中第二个输入中不存在的元素。

result = setdiff(idx, A);

对于您提供的输入大小,我的执行时间提高了35倍。这可能是由于您使用unique(A)这将导致成本高昂的事实,因为它必须对这个庞大的数组进行排序和处理。

作为旁注,tictoc不是一种非常准确的代码基准测试方法。相反,您要使用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);