วิธีค้นหาสตริงในอาร์เรย์เซลล์ใน MATLAB


103

สมมติว่าฉันมีอาร์เรย์ของเซลล์

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

ฉันควรทำอย่างไรหากต้องการค้นหาดัชนีของ'KU'?


7
โปรดทราบว่าคำตอบยอดนิยมในปัจจุบันค่อนข้างล้าสมัย อย่าลืมตรวจสอบคำตอบนี้ด้วย
Dennis Jaheruddin

คำตอบ:


128

ฉันเดาว่ารหัสต่อไปนี้สามารถทำเคล็ดลับ:

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

ผลตอบแทนนี้

ans = 
     2

11
โปรดทราบว่าโซลูชันทั่วไปนี้ดีเพราะใช้ได้กับข้อมูลหลายประเภท แต่ใช้ได้กับข้อมูลที่ตรงกันเท่านั้น หากคุณต้องการการแข่งขันกรณีตายดูstackoverflow.com/a/9433112/44737 หากคุณต้องการจับคู่สิ่งที่ซับซ้อนมากขึ้นเช่น regex หรือฟิลด์ในโครงสร้างโปรดดูstackoverflow.com/a/8061808/44737
rob

ismember มีความอึดอัดมากขึ้นและสามารถรับการอัปเดตด้วยเวอร์ชันที่ใหม่กว่าได้ ฉันรู้สึกปลอดภัยมากขึ้นด้วยฟังก์ชั่นที่ใช้ str เช่น strcmpi เป็นต้น
Maddy

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 วินาที

ดังนั้นstrcmp('KU', strs)ใช้เวลาน้อยกว่าอย่างเห็นได้ชัดismember(strs,'KU')


5
เยี่ยมมาก! ทางออกของคุณควรเป็นอันดับต้น ๆ !
Antonvh

1
ใช่ฉันเห็นด้วยนี่เป็นทางออกที่ดีที่สุดอย่างไรก็ตามเป็นเพียงการเปรียบเทียบระหว่างโซลูชันของ andreys และ vidars อันที่จริงอันเดรย์ควรจะได้รับมัน
ลีโอ

1
จริงๆแล้วควรจะชี้ให้เห็นว่าวิธีนี้ใช้ไม่ได้หากคุณเปรียบเทียบอาร์เรย์สองอาร์เรย์ที่มีขนาดต่างกัน (เช่นถ้าแทนที่จะเป็น 'KU' ทางด้านซ้ายคุณจะมีอาร์เรย์ของสตริง) วิธีการแก้ปัญหาของ Vidar ใช้งานได้ในกรณีนั้น (ค่อนข้างดี) ดังนั้นจึงเป็นเรื่องทั่วไป
เนท

@pankaj: เปรียบเทียบกับการสร้าง Map of String-> Indices แล้วรับดัชนีโดยการค้นหาแผนที่ได้อย่างไร? ขอความฉลาดที่สมบูรณ์แบบ
faizan

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 จะใช้งานได้ขอบคุณ!
Benjamin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.