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'?


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

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')


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.


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 :).


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))

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.


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'))

-2

apakah kamu sudah mencoba

indices = Find(strs, 'KU')

lihat link

kalau tidak,

indices = strfind(strs, 'KU');

juga harus bekerja jika saya tidak salah.


Saya telah mencoba menemukan tetapi karena arraynya adalah array sel sehingga MATLAB mengembalikan saya beberapa kesalahan ... Tetapi fungsi strfind tampaknya berfungsi, terima kasih!
Benjamin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.