假设我有一个向量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)
也不会起干草堆的作用,针可能不是同一个维度。
是否有一个整洁的,单行可以用来实现同样的目的?
答案 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)
如果needle
的每个成员都保证在haystack
中至少出现 ,则可以使用bsxfun
,然后使用第二个输出{ {1}}:
max
如果[~, where] = max(bsxfun(@eq, needle, haystack.'))
的元素出现多次,则会显示其第一个外观的索引。
如果needle
中needle
的元素未显示,您可以修改上面的代码以返回haystack
(例如)那种情况:
NaN
在最常见的情况下,如果您希望[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))];
希望这有帮助