Find index of all (non-unique) elements in a cell array as they appear in a second (sorted and unique) cell array

浪尽此生 提交于 2019-12-17 16:48:14

问题


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

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

I am trying to get for each string in cell array A, the index that matches that string in cell array B. A will have repeated values, B will not.

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

outputs

1
5
6 

but I want to get

1
5
1
6

preferably in a one liner. I can't use strcmp instead of ismember either as the vectors are different sizes.

The vectors will actually contain date strings, and I need the index not a logical index matrix, I'm interested in the number not to use it for indexing.

How do I do it?


回答1:


You flip the arguments to ismember, and you use the second output argument:

[~,loc]=ismember(A,B)

loc =

     1
     5
     1
     6

The second output tells you where the elements of A are in B.

If you are working with very strict limits to how many lines you can have in your code, and are in no position to fire the manager who imposed such limitations, you may want to access the second output of ismember directly. In order to do this, you can create the following helper function that allows to directly access the i-th output of a function

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};


来源:https://stackoverflow.com/questions/11562196/find-index-of-all-non-unique-elements-in-a-cell-array-as-they-appear-in-a-seco

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!