2013-11-20 99 views
1

说我有一个向量needle = [3 2 6];,我想在另一个向量haystack = [0 1 2 3 4 5 6 7 8 9];中找到其元素的索引。要返回的结果与needle具有相同的尺寸,在这种情况下将为[4 3 7]needle的元素不一定是唯一的。我已经使用for循环使用函数文件实现了这一点。使用ismember的实现可能可行,但如果needle中的两个或多个元素相同,则会遇到问题,因为ismember将为needle中所有元素返回相同的单个'1'。在MATLAB中查找另一个向量中元素的位置

find(haystack == needle) 

也不能作为干草堆和针可能不是相同的尺寸。

是否有一个整齐的,单线程,我可以用来实现同样的事情?

+0

是的,这是一个重复的。只是你的问题是一个单元阵列。我认为这篇文章可能会被封闭。 – iab

回答

5

ismember做的工作,但你要第二个输出:

[~, ind] = ismember(needle, haystack) 

例如

needle = [3 2 6 6]; 
haystack = [0 1 2 3 4 5 6 7 8 9]; 
[~, ind] = ismember(needle, haystack) 

ind = 

    4 3 7 7 
+0

如果针和干草堆是复数,这种行为似乎不同。你知道为什么吗? – iab

+1

不 - 复杂的数字为我工作。我想知道你的问题是否与精度有关?如果你的复数是双精度的,那么你认为在大海捞针中的价值可能实际上相差很小。挑选一个数字并尝试直接比较它们(例如'needle(31)== haystack(415)') – Dan

0

我觉得这样的事情可能会为你工作,答案是1×3的阵列

answer = [find(haystack==needle(1)),find(haystack==needle(2)),find(haystack==needle(3))]; 

希望这有助于

+1

Nah。我并不总是知道针的大小,所以这不是便携式的。如果我要使用你的实现,我将不得不使用for循环和size函数。 – iab

1
  1. 如果needle每个成员保证出现在至少一次 in haystack,您可以使用bsxfun然后第二个输出max

    [~, where] = max(bsxfun(@eq, needle, haystack.')) 
    

    如果needle元素多次出现,这会给你的第一出现的指数。

  2. 如果可能不会出现在haystackneedle的元素,可以修改上述代码在这种情况下返回NaN(例如):

    [val, where] = max(bsxfun(@eq, needle, haystack.')); 
    where(~val) = NaN 
    
  3. 在最一般的情况下,如果你想获得所有(如果有的话)haystackneedle每一个元素的出场:

    cellfun(@find,mat2cell(bsxfun(@eq,needle,haystack.'),numel(haystack),ones(1,numel(needle))),'uni',false) 
    

    例子:

    >> needle = [4 2 5 8]; 
    >> haystack = [0 1 2 3 4 5 6 5 7]; 
    >> cellfun(@find,mat2cell(bsxfun(@eq, needle, haystack.'),numel(haystack),ones(1,numel(needle))),'uni',false) 
    
    ans = 
    
    [5] [3] [2x1 double] [0x1 double] 
    
    >> ans{3} 
    
    ans = 
    
        6 
        8 
    
相关问题