สมมติว่าฉันมีอาร์เรย์ของเซลล์
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ฉันควรทำอย่างไรหากต้องการค้นหาดัชนีของ'KU'
?
สมมติว่าฉันมีอาร์เรย์ของเซลล์
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ฉันควรทำอย่างไรหากต้องการค้นหาดัชนีของ'KU'
?
คำตอบ:
ฉันเดาว่ารหัสต่อไปนี้สามารถทำเคล็ดลับ:
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ind=find(ismember(strs,'KU'))
ผลตอบแทนนี้
ans =
2
>> 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')
ตั้งแต่ปี 2011a วิธีที่แนะนำคือ:
booleanIndex = strcmp('KU', strs)
หากคุณต้องการรับดัชนีจำนวนเต็ม (ซึ่งคุณมักไม่ต้องการ) คุณสามารถใช้:
integerIndex = find(booleanIndex);
strfind
เลิกใช้งานแล้วดังนั้นอย่าพยายามใช้มัน
ฉันเห็นว่าทุกคนพลาดข้อบกพร่องที่สำคัญที่สุดในรหัสของคุณ:
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ควรจะเป็น:
strs = {'HA' 'KU' 'NA' 'MA' 'TATA'}
หรือ
strs = {'HAKUNA' 'MATATA'}
ตอนนี้ถ้าคุณใช้
ind=find(ismember(strs,'KU'))
คุณจะไม่ต้องกังวล :)
คำตอบอื่น ๆ อาจง่ายกว่าสำหรับกรณีนี้ แต่เพื่อความสมบูรณ์ฉันคิดว่าฉันจะเพิ่มการใช้ cellfun ด้วยฟังก์ชันที่ไม่ระบุตัวตน
indices = find(cellfun(@(x) strcmp(x,'KU'), strs))
ซึ่งมีข้อได้เปรียบที่คุณสามารถทำให้ไม่คำนึงถึงขนาดตัวพิมพ์หรือใช้ในกรณีที่คุณมีโครงสร้างอาร์เรย์ของเซลล์:
indices = find(cellfun(@(x) strcmpi(x.stringfield,'KU'), strs))
รหัสที่สั้นที่สุด:
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
[~,ind]=ismember('KU', strs)
แต่จะส่งกลับเฉพาะตำแหน่งแรกในstrs
. ind=0
หากองค์ประกอบไม่พบแล้ว
ฟังก์ชัน strcmp และ strcmpi เป็นวิธีที่ตรงที่สุดในการดำเนินการนี้ พวกเขาค้นหาผ่านอาร์เรย์
strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))