MATLAB में सेल ऐरे में स्ट्रिंग की खोज कैसे करें?


103

मान लीजिए कि मेरे पास सेल सरणी है

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

यदि मुझे सूचकांक प्राप्त करना है तो मुझे क्या करना चाहिए 'KU'?


7
ध्यान दें कि वर्तमान शीर्ष उत्तर काफी पुराना है। इस उत्तर को भी अवश्य देखें ।
डेनिस जहरुद्दीन

जवाबों:


128

मुझे लगता है कि निम्नलिखित कोड चाल कर सकता है:

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

यह लौटाता है

ans = 
     2

11
ध्यान रखें कि यह सामान्य समाधान अच्छा है क्योंकि यह कई डेटा प्रकारों के लिए काम करता है, लेकिन यह केवल सटीक मिलान के लिए काम करता है। यदि आपको केस-असंवेदनशील मैच की आवश्यकता है, तो stackoverflow.com/a/9433112/44737 देखें । यदि आपको एक रेगेक्स या एक संरचना में एक क्षेत्र की तरह कुछ और अधिक जटिल मिलान करने की आवश्यकता है, तो देखें stackoverflow.com/a/8061808/44737
लूट

ismember थोड़ा अधिक क्लंकी है और नए संस्करणों के साथ अपडेट हो सकता है। मैं 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
हां मैं सहमत हूं, यह सबसे अच्छा समाधान है, हालांकि इसके बीच andreys और vidars समाधान की तुलना है। तो वास्तव में andrey को इसे प्राप्त करना चाहिए।
सिंह

1
वास्तव में, यह बताया जाना चाहिए कि यदि आप अलग-अलग आकार के दो सरणियों की तुलना कर रहे हैं (यानी यदि बाईं ओर 'केयू' के बजाय, आपके पास स्ट्रिंग्स की एक सरणी है) तो यह विधि काम नहीं करती है। विदर का समाधान उस मामले में (काफी अच्छी तरह से) काम करता है, इसलिए यह अधिक सामान्य है।
नैट

@ पंकज: यह स्ट्रिंग का नक्शा बनाने की तुलना कैसे करता है-> सूचकांक और फिर नक्शा खोज कर सूचकांक प्राप्त करना? सिद्ध ज्ञानी से पूछ रहे हैं।
१३:३३

39

2011 ए के बाद से, अनुशंसित तरीका है:

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

इस मामले के लिए अन्य उत्तर संभवतः सरल हैं, लेकिन पूर्णता के लिए मुझे लगा कि मैं एक अनाम फ़ंक्शन के साथ सेलफुन का उपयोग जोड़ूंगा

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 काम कर रहा है, धन्यवाद!
बेंजामिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.