MATLABのセル配列で文字列を検索する方法は?


回答:


128

次のコードでうまくいくと思います:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ind=find(ismember(strs,'KU'))

これは戻ります

ans = 
     2

11
この一般的なソリューションは複数のデータタイプに対して機能するため、優れていますが、完全一致の場合にのみ機能することに注意してください。大文字と小文字を区別しない一致が必要な場合は、stackoverflow.com / a / 9433112/44737を参照してください。構造体の正規表現やフィールドなど、より複雑なものに一致させる必要がある場合は、stackoverflow.com
rob

ismemberは少し不格好で、新しいバージョンで更新できます。私はなど、関数strcmpiのようなSTRベースの機能をより安全に感じる
マディ

1
Octaveでも動作します
Nino van Hooff

90
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc

経過時間は0.001976秒です。

>> tic; find(strcmp('KU', strs)); toc

経過時間は0.000014秒です。

SOは、明らかによりstrcmp('KU', strs)もはるかに少ない時間がかかりますismember(strs,'KU')


5
すごい!あなたの解決策が一番です!
Antonvh 2014

1
はい、同意します。これが最良の解決策ですが、それはアンドレイズとヴィダーズの解決策の比較にすぎません。アンドリーは実際にそれを取得する必要があります。
レオ

1
実際には、サイズの異なる2つの配列を比較する場合(つまり、左側に「KU」の代わりに文字列の配列がある場合)、このメソッドは機能しないことを指摘しておく必要があります。その場合、Vidarのソリューションは(かなりうまく)機能するため、より一般的です。
2014年

@pankaj:文字列->インデックスのマップを作成し、マップルックアップを実行してインデックスを取得するのとどのように比較しますか?賢明なパフォーマンスを求める。
ファイザン、2016年

39

2011a以降、推奨される方法は次のとおりです。

booleanIndex = strcmp('KU', strs)

整数インデックス(たいていは必要ない)を取得したい場合は、以下を使用できます。

integerIndex = find(booleanIndex);

strfind は非推奨であるため、使用しないようにしてください。


23

私は誰もがあなたのコードの最も重要な欠陥を見逃しているのを見ます:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}

でなければなりません:

strs = {'HA' 'KU' 'NA' 'MA' 'TATA'} 

または

strs = {'HAKUNA' 'MATATA'}

今あなたがこだわり続けるなら

ind=find(ismember(strs,'KU'))

あなたは持っていないでしょう心配を :)。


元の質問を編集しようとしていましたが、答えが多すぎました:)
raggot

13

このケースでは他の答えがおそらくもっと簡単ですが、完全を期すために、無名関数でcellfunの使用を追加すると思いました

indices = find(cellfun(@(x) strcmp(x,'KU'), strs))

これには、大文字と小文字を区別しない、または構造のセル配列がある場合に使用できるという利点があります。

indices = find(cellfun(@(x) strcmpi(x.stringfield,'KU'), strs))

6

最も短いコード:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
[~,ind]=ismember('KU', strs)

しかし、それはの最初の位置のみを返しますstrs。要素が見つからない場合ind=0


5

strcmp関数とstrcmpi関数は、これを行う最も直接的な方法です。彼らは配列を検索します。

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))

-2

試しましたか

indices = Find(strs, 'KU')

参照リンクを

あるいは、

indices = strfind(strs, 'KU');

私が間違っていない場合も動作するはずです。


検索を試みましたが、配列がセル配列であるため、MATLABはいくつかのエラーを返します...しかし、関数strfindは機能しているようです。
ベンジャミン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.