Найдите индекс всех (неуникальных) элементов в массиве ячеек, как они появляются во втором (отсортированном и уникальном) массиве ячеек

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

желательно в один лайнер. Я не могу использовать strcmp вместо ismember, поскольку векторы имеют разные размеры.

Векторы на самом деле будут содержать строки даты, и мне нужен индекс, а не матрица логического индекса, меня интересует число, чтобы не использовать его для индексации.

Как мне это сделать?


person Dan    schedule 19.07.2012    source источник


Ответы (1)


Вы переключаете аргументы на 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};
person Jonas    schedule 19.07.2012
comment
Могу ли я использовать это встроенное? Сообщение, удаленное EitanT, работает отлично и встроено, это намного проще, но могу ли я сделать что-то вроде ScalarC - loc в одной строке? - person Dan; 19.07.2012
comment
@Dan: Вы не можете, если только вы не определите вспомогательную функцию, как я только что сделал в своем редактировании. - person Jonas; 19.07.2012
comment
Круто, спасибо, нет, я буду придерживаться двухстрочного метода. У меня нет такого ограничения, но в стороне, кто когда-либо был в состоянии уволить своих начальников? - person Dan; 19.07.2012
comment
Я могу восстановить свой ответ, но это решение является правильным ответом. +1 для Джонаса. - person Eitan T; 19.07.2012
comment
@Dan: Очень часто начальство, которое, кажется, навязывает остроты, сами программисты, и этот глупый голос в голове можно уволить, приложив некоторые усилия. - person Jonas; 19.07.2012