Fan*_*Fox 26 arrays search matlab matrix find
想象一下,我有两个数组:
a = [1, 2, 5, 7, 6, 9, 8, 3, 4, 7, 0];
b = [5, 9, 6];
Run Code Online (Sandbox Code Playgroud)
我想在a(只有第一个命中)中找到b值的索引,即:
c = [3, 6, 5];
Run Code Online (Sandbox Code Playgroud)
有没有一个简单的Matlab原生方式来做这个没有循环和搜索.
我试过用find():
find(a == b)
Run Code Online (Sandbox Code Playgroud)
如果你这样做会有效:
for i = 1:length(b)
index = find(a == b(i));
c = [c, index(1)]
end
Run Code Online (Sandbox Code Playgroud)
但是它比这更容易理想.
Gun*_*uyf 20
你可以使用arrayfun轻松地将for循环压缩成一个简单的单行程序:
arrayfun(@(x) find(a == x,1,'first'), b )
Run Code Online (Sandbox Code Playgroud)
还可以看到Scenia对更新的matlab版本(> R2012b)的回答.
sce*_*nia 18
这实际上是内置的ismember.你只需要设置正确的标志,然后它是一个单行,你不需要arrayfun.默认情况下,比R2012b更新的版本会使用此行为.
最初,ismember如果有几个会返回最后一次出现,R2012a标志使它返回第一个.
这是我的测试结果:
a = [1, 2, 5, 7, 6, 9, 8, 3, 4, 7, 0, 6];
b = [5, 9, 6];
[~,c] = ismember(b,a,'R2012a');
>> c
c =
3 6 5
Run Code Online (Sandbox Code Playgroud)
这是ismember对@Pursuit建议的方法的修复.这样它可以处理其中一个数字的多次出现,并以正确的顺序返回结果:
[tf,loc] = ismember(a,b);
tf = find(tf);
[~,idx] = unique(loc(tf), 'first');
c = tf(idx);
Run Code Online (Sandbox Code Playgroud)
结果:
>> c
c =
3 6 5
Run Code Online (Sandbox Code Playgroud)