MATLAB'da hücre dizisinde bir dize nasıl aranır?


103

Diyelim ki hücre dizisine sahibim

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

Dizinini bulmak istersem ne yapmalıyım 'KU'?


7
Mevcut en iyi cevabın oldukça güncel olmadığını unutmayın. Bu yanıtı da kontrol ettiğinizden emin olun .
Dennis Jaheruddin

Yanıtlar:


128

Sanırım aşağıdaki kod hile yapabilir:

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

Bu geri dönüyor

ans = 
     2

11
Bu genel çözümün, birden çok veri türü için işe yaradığı için iyi olduğunu, ancak yalnızca tam eşleşmeler için işe yaradığını unutmayın. Büyük / küçük harfe duyarlı olmayan bir eşleşmeye ihtiyacınız varsa, stackoverflow.com/a/9433112/44737 adresine bakın . Eğer bir regex veya bir yapıda bir alanda gibi daha karmaşık bir şey eşleşmesi gerekiyorsa, bkz stackoverflow.com/a/8061808/44737
soymak

ismember biraz daha hantal ve daha yeni sürümlerle güncellenebilir. Strcmpi vb. Gibi str tabanlı işlevlerle daha güvende hissediyorum
Maddy


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

Geçen süre 0.001976 saniyedir.

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

Geçen süre 0.000014 saniyedir.

Yani, açıkça strcmp('KU', strs)daha az zaman alıyorismember(strs,'KU')


5
Harika! Çözümünüz en iyisi olmalı!
Antonvh

1
Evet, katılıyorum, bu en iyi çözüm, ancak bu yalnızca andreys ve vidars çözümleri arasında bir karşılaştırma. Yani aslında Andrey onu almalı.
Leo

1
Aslında, farklı boyuttaki iki diziyi karşılaştırıyorsanız (yani, sol taraftaki 'KU' yerine bir dizi diziniz varsa) bu yöntemin işe yaramayacağına dikkat edilmelidir. Vidar'ın çözümü bu durumda işe yarıyor (oldukça güzel), bu yüzden daha genel.
Nate

@pankaj: Bu, bir Dize-> Endeksler Haritası oluşturup ardından bir harita araması yaparak indeks elde etmeye kıyasla nasıl? Mükemmel bir şekilde sormak.
faizan

39

2011a'dan beri önerilen yol şudur:

booleanIndex = strcmp('KU', strs)

Eğer tamsayı indeksini almak istiyorsanız (ki genellikle ihtiyacınız yoktur), şunu kullanabilirsiniz:

integerIndex = find(booleanIndex);

strfind kullanımdan kaldırıldı, bu yüzden onu kullanmamaya çalışın.


23

Kodunuzdaki en önemli kusuru herkesin gözden kaçırdığını görüyorum:

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

olmalı:

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

veya

strs = {'HAKUNA' 'MATATA'}

Şimdi kullanmaya devam edersen

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

Endişelenmenize gerek yok :).


Orijinal soruyu düzenlemek üzereydim ama çok fazla cevap gördüm :)
raggot

13

Diğer cevaplar muhtemelen bu durum için daha basittir, ancak bütünlük için anonim bir işlevle cellfun kullanımını ekleyeceğimi düşündüm.

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

Bu, onu kolayca büyük / küçük harf duyarlı hale getirme veya hücre yapı dizisine sahip olduğunuz durumlarda kullanma avantajına sahiptir:

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

6

En kısa kod:

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

Ancak içinde yalnızca ilk konumu döndürür strs. Öğe bulunmazsa o zaman ind=0.


5

Strcmp ve strcmpi işlevleri bunu yapmanın en doğrudan yoludur. Diziler arasında arama yaparlar.

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

-2

denedin mi

indices = Find(strs, 'KU')

bağlantıya bakın

alternatif olarak

indices = strfind(strs, 'KU');

yanılmıyorsam da çalışmalı.


Bulmayı denedim ama dizi hücre dizisi olduğundan MATLAB bana bazı hatalar döndürüyor ... Ama strfind işlevi çalışıyor gibi görünüyor, teşekkürler!
Benjamin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.