এমএটিএবিএলে সেল অ্যারেতে স্ট্রিং কীভাবে সন্ধান করবেন?


103

ধরা যাক আমার কাছে সেল অ্যারে রয়েছে

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

আমি যদি সূচকটি খুঁজতে চাই তবে আমার কী করা উচিত 'KU'?


7
নোট করুন যে বর্তমান শীর্ষ উত্তরটি বেশ পুরানো। এই উত্তরটিও পরীক্ষা করে দেখুন ।
ডেনিস জাহেরউদ্দিন

উত্তর:


128

আমার ধারণা, নিম্নলিখিত কোডটি কৌশলটি করতে পারে:

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

এই ফিরে আসে

ans = 
     2

11
মনে রাখবেন এই জেনেরিক সমাধানটি ভাল কারণ এটি একাধিক ডেটা ধরণের জন্য কাজ করে তবে এটি কেবল সঠিক ম্যাচের জন্য কাজ করে। আপনার যদি কেস-সংবেদনশীল ম্যাচ দরকার হয় তবে স্ট্যাকওভারফ্লো . com/ a/ 9433112/44737 দেখুন । আপনি যদি একটি Regex বা কাঠামো একটি ক্ষেত্র মত আরো জটিল কিছু মেলে প্রয়োজন হয়, তাহলে দেখতে stackoverflow.com/a/8061808/44737
ডাকাতি

ইসেম্বারটি আরও কিছুটা জটিল এবং আরও নতুন সংস্করণ সহ আপডেট হতে পারে। আমি strcmpi ইত্যাদির মতো str ভিত্তিক ফাংশনগুলির সাথে আরও নিরাপদ বোধ করি
ম্যাডি

1
অক্টাভেতেও কাজ করে
নিনো ভ্যান হুফ

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
গ্রেট! আপনার সমাধান শীর্ষ এক হওয়া উচিত!
আন্তোনভ

1
হ্যাঁ আমি সম্মত, এটি সেরা সমাধান, তবে এটি এন্ড্রে এবং ভিদার সমাধানগুলির মধ্যে কেবল একটি তুলনা। সুতরাং প্রকৃতপক্ষে Andrey এটি পাওয়া উচিত।
লিও

1
প্রকৃতপক্ষে, এটি চিহ্নিত করা উচিত যে আপনি যদি বিভিন্ন আকারের দুটি অ্যারে তুলনা করছেন (তবে বাম দিকে 'কেউ' পরিবর্তে আপনার কাছে একটি স্ট্রিং রয়েছে) এই পদ্ধতিটি কার্যকর হয় না। বিদারের সমাধান সেক্ষেত্রে কার্যকর হয় (বেশ সুন্দরভাবে), তবে এটি আরও সাধারণ।
Nate

@ পঙ্কজ: স্ট্রিং-> সূচকের মানচিত্র তৈরি করা এবং তারপরে মানচিত্রের অনুসন্ধান করে সূচি পাওয়ার সাথে এটি কীভাবে তুলনা করে? পারফেক্ট বুদ্ধিমান জিজ্ঞাসা।
ফিজান

39

২০১১a থেকে, প্রস্তাবিত উপায় হ'ল:

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

আপনার কোনও উদ্বেগ থাকবে না :)।


আমি মূল প্রশ্নটি সম্পাদনা করতে যাচ্ছিলাম তবে অনেকগুলি উত্তর দেখেছি :)
রাগগোট

13

অন্যান্য উত্তরগুলি সম্ভবত এই মামলার জন্য সহজ, তবে সম্পূর্ণতার জন্য আমি ভেবেছিলাম একটি বেনাম ফাংশন সহ আমি সেলফুনের ব্যবহার যুক্ত করব

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

আমি ভুল না হলে কাজ করা উচিত।


আমি সন্ধান করার চেষ্টা করেছি কিন্তু যেহেতু অ্যারেটি সেল অ্যারে তাই ম্যাটল্যাব আমাকে কিছু ত্রুটি ফিরিয়ে দিয়েছে ... তবে স্ট্রিংফাইন্ডটি ফাংশনটি কাজ করছে বলে মনে হচ্ছে, ধন্যবাদ!
বেনিয়ামিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.