在一个单元数组中查找所有(非唯一)元素在第二个(排序且唯一)单元数组中出现的索引

5
A = {'A'; 'E'; 'A'; 'F'};

B = {'A';'B';'C';'D';'E'; 'F'};

我正在尝试获取单元格数组 A 中每个字符串在单元格数组 B 中匹配的索引。 A 中将有重复值,B 中不会。

find(ismember(B, A) == 1)

输出
1
5
6 

但我想获得

1
5
1
6

最好在一行中完成。由于向量的大小不同,因此我不能使用ismember替换strcmp。

实际上,这些向量将包含日期字符串,我需要索引而不是逻辑索引矩阵,我对数字感兴趣,而不是用它进行索引。

我该怎么做?

1个回答

7
你需要将参数反转到 ismember 中,并使用第二个输出参数:
[~,loc]=ismember(A,B)

loc =

     1
     5
     1
     6

第二个输出结果告诉您A元素在B中的位置。
如果您的代码行数受到严格限制,并且无法解雇实施这种限制的经理,您可能希望直接访问ismember的第二个输出。为此,您可以创建以下辅助函数,以直接访问函数的第i个输出。
function out = accessIthOutput(fun,ii)
%ACCESSITHOUTPUT returns the i-th output variable of the function call fun
%
% define fun as anonymous function with no input, e.g.
% @()ismember(A,B)
% where A and B are defined in your workspace
%
% Using the above example, you'd access the second output argument
% of ismember by calling
% loc = accessIthOutput(@()ismember(A,B),2)


%# get the output
[output{1:ii}] = fun();

%# return the i-th element
out = output{ii};

我可以在这里使用内联吗?EitanT删除的帖子能够完美地在内联中工作,这很简单,但我可以像“ScalarC-loc”一样在单行中执行吗? - Dan
@Dan:除非您像我在编辑中所做的那样定义一个辅助函数,否则您不能这样做。 - Jonas
谢谢,我会坚持使用两行的方法。虽然我没有这样的限制,但是顺便问一下,有谁能解雇他们的上级呢? - Dan
3
我可以恢复我的回答,但是“这个”解决方案才是正确的答案。赞一个给Jonas。 - Eitan T
@Dan:很多时候,看起来强制使用一行代码的“上级”,实际上是代码编写者自己,只要付出一些努力就可以消除脑海中那个愚蠢的声音。 - Jonas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接