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

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

セル配列内の文字列ごとに、セル配列内Aのその文字列と一致するインデックスを取得しようとしていますBA値が繰り返されますが、そうでBはありません。

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

出力

1
5
6 

しかし、私は取得したいです

1
5
1
6

できればワンライナーで。ベクトルのサイズが異なるため、 ismember の代わりに strcmp を使用することもできません。

ベクトルには実際には日付文字列が含まれます。論理インデックス マトリックスではなくインデックスが必要です。インデックス作成に使用しないように数値に関心があります。

どうすればいいのですか?

4

1 に答える 1

7

引数を に反転しismember、2 番目の出力引数を使用します。

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

loc =

     1
     5
     1
     6

A2 番目の出力は、 の要素がのどこにあるかを示しますB

コードに含めることができる行数に非常に厳しい制限をかけて作業しており、そのような制限を課したマネージャーを解雇する立場にない場合は、 の 2 番目の出力に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};
于 2012-07-19T13:54:45.917 に答える