在MATLAB中找到另一个向量中元素的位置

时间:2013-11-20 14:25:03

标签: matlab

假设我有一个向量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” {1}}是一样的。

    find(haystack == needle)

也不会起干草堆的作用,针可能不是同一个维度。

是否有一个整洁的,单行可以用来实现同样的目的?

3 个答案:

答案 0 :(得分:5)

ismember确实有效,但您需要第二个输出:

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

e.g。

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

答案 1 :(得分:1)

  1. 如果needle的每个成员都保证在haystack中至少出现 ,则可以使用bsxfun,然后使用第二个输出{ {1}}:

    max

    如果[~, where] = max(bsxfun(@eq, needle, haystack.')) 的元素出现多次,则会显示其第一个外观的索引。

  2. 如果needleneedle 的元素未显示,您可以修改上面的代码以返回haystack(例如)那种情况:

    NaN
  3. 在最常见的情况下,如果您希望[val, where] = max(bsxfun(@eq, needle, haystack.')); where(~val) = NaN needle的每个元素的全部(如果有)外观:

    haystack

    示例:

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

答案 2 :(得分:0)

我觉得这样的事可能对你有用,答案是1x3阵列

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

希望这有帮助