Bagaimana cara mencari string dalam array sel di MATLAB?

103

Katakanlah saya memiliki array sel

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

Apa yang harus saya lakukan jika saya ingin mencari indeks 'KU'?

Benjamin
sumber
7
Perhatikan bahwa jawaban teratas saat ini sudah cukup usang. Pastikan juga untuk memeriksa jawaban ini .
Dennis Jaheruddin

Jawaban:

128

Saya kira kode berikut bisa melakukan triknya:

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

Ini kembali

ans = 
     2
Vidar
sumber
11
Perlu diingat bahwa solusi umum ini bagus karena berfungsi untuk beberapa tipe data, tetapi hanya berfungsi untuk pencocokan tepat. Jika Anda membutuhkan pencocokan tidak peka huruf besar / kecil, lihat stackoverflow.com/a/9433112/44737 . Jika Anda perlu mencocokkan sesuatu yang lebih kompleks seperti regex atau bidang dalam suatu struktur, lihat stackoverflow.com/a/8061808/44737
rob
ismember sedikit lebih kikuk dan dapat diperbarui dengan versi yang lebih baru. Saya merasa lebih aman dengan fungsi berbasis str seperti strcmpi, dll.
Maddy
1
Bekerja di Oktaf, juga
Nino van Hooff
90
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc

Waktu yang berlalu adalah 0,001976 detik.

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

Waktu yang berlalu adalah 0,000014 detik.

JADI, jelas strcmp('KU', strs)membutuhkan waktu yang jauh lebih sedikit daripadaismember(strs,'KU')

Pankaj Gupta
sumber
5
Bagus! Solusi Anda harus menjadi yang teratas!
Antonvh
1
Ya saya setuju, ini adalah solusi terbaik, namun ini hanya perbandingan antara solusi andreys dan vidars. Jadi sebenarnya andrey harus mendapatkannya.
Leo
1
Sebenarnya, harus ditunjukkan bahwa metode ini tidak berfungsi jika Anda membandingkan dua larik dengan ukuran berbeda (misalnya, jika alih-alih 'KU' di sisi kiri, Anda memiliki larik string). Solusi Vidar berfungsi dalam kasus itu (cukup baik), jadi lebih umum.
Nate
@pankaj: Bagaimana hal ini dibandingkan dengan membuat Peta String-> Indeks dan kemudian mendapatkan indeks dengan melakukan pencarian peta? Menanyakan kinerja yang bijaksana.
faizan
39

Sejak 2011a, cara yang direkomendasikan adalah:

booleanIndex = strcmp('KU', strs)

Jika Anda ingin mendapatkan indeks integer (yang seringkali tidak Anda perlukan), Anda dapat menggunakan:

integerIndex = find(booleanIndex);

strfind sudah usang, jadi cobalah untuk tidak menggunakannya.

Andrey Rubshtein
sumber
23

Saya melihat bahwa semua orang melewatkan kesalahan terpenting dalam kode Anda:

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

seharusnya:

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

atau

strs = {'HAKUNA' 'MATATA'}

Sekarang jika Anda tetap menggunakan

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

Anda tidak akan khawatir :).

Singkat
sumber
Saya akan mengedit pertanyaan asli tetapi melihat terlalu banyak jawaban :)
raggot
13

Jawaban lain mungkin lebih sederhana untuk kasus ini, tetapi untuk kelengkapan saya pikir saya akan menambahkan penggunaan cellfun dengan fungsi anonim

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

yang memiliki keuntungan bahwa Anda dapat dengan mudah membuatnya tidak peka huruf besar / kecil atau menggunakannya dalam kasus di mana Anda memiliki susunan sel struktur:

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

Kode terpendek:

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

Tapi itu hanya mengembalikan posisi pertama strs. Jika elemen tidak ditemukan maka ind=0.

Maxim Suslov
sumber
5

Fungsi strcmp dan strcmpi adalah cara paling langsung untuk melakukan ini. Mereka mencari melalui array.

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))
Andrew Janke
sumber
-2

apakah kamu sudah mencoba

indices = Find(strs, 'KU')

lihat link

kalau tidak,

indices = strfind(strs, 'KU');

juga harus bekerja jika saya tidak salah.

Tom
sumber
Saya telah mencoba menemukan tetapi karena arraynya adalah array sel sehingga MATLAB mengembalikan saya beberapa kesalahan ... Tetapi fungsi strfind tampaknya berfungsi, terima kasih!
Benjamin