MATLAB में हैश टेबल


92

MATLAB हैश तालिकाओं के लिए कोई समर्थन है?


कुछ पृष्ठभूमि

मैं मतलाब में एक समस्या पर काम कर रहा हूं जिसमें एक छवि के पैमाने-स्थान प्रतिनिधित्व की आवश्यकता होती है। ऐसा करने के लिए, मैं कुछ रेंज के sigma*s^kलिए विचरण के साथ 2-डी गाऊसी फ़िल्टर बनाता हूं k। और फिर मैं छवि को फ़िल्टर करने के लिए प्रत्येक का उपयोग करता हूं। अब, मैं kफ़िल्टर्ड छवि से किसी प्रकार का मानचित्रण चाहता हूँ ।

यदि kमैं हमेशा पूर्णांक था, तो मैं बस एक 3 डी सरणी बनाऊंगा:

arr[k] = <image filtered with k-th guassian>

हालाँकि, kयह पूर्ण रूप से पूर्णांक नहीं है, इसलिए मैं ऐसा नहीं कर सकता। मैं ऐसा करने के बारे में सोच रहा था कि ऐसा क्या kहै:

arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>

जो पहली बार में बहुत अच्छा लगता है, सिवाय इसके कि मैं इस लुकअप को लगभग 20 हजार या 30 मानों के साथ संभावित रूप से कर पाऊंगा k, और मुझे डर है कि इससे प्रदर्शन को नुकसान पहुंचेगा।

मुझे आश्चर्य है कि अगर मैं किसी प्रकार की हैश टेबल के साथ ऐसा करना बेहतर नहीं होगा, ताकि मुझे O (n) के बजाय O (1) देखने का समय मिल जाए।


अब, मुझे पता है कि मुझे समय से पहले अनुकूलन नहीं करना चाहिए, और मुझे यह समस्या बिल्कुल भी नहीं हो सकती है, लेकिन याद रखें, यह सिर्फ पृष्ठभूमि है, और ऐसे मामले भी हो सकते हैं, जहां यह वास्तव में सबसे अच्छा समाधान है, चाहे वह कोई भी हो। मेरी समस्या के लिए सबसे अच्छा समाधान ।

जवाबों:


14

मतलबी के पास हैशटेबल्स का समर्थन नहीं है। संपादित करें r2010a तक, कि है, देख @Amro के जवाब।

अपने लुक-अप को गति देने के लिए, आप ड्रॉप-डाउन कर सकते हैं find, और तार्किक INDEXING का उपयोग कर सकते हैं ।

arr{array_of_ks==k} = <image filtered with k-th Gaussian>

या

arr(:,:,array_of_ks==k) = <image filtered with k-th Gaussian>

हालाँकि, मैटलैब के साथ मेरे सभी अनुभव में, मैंने कभी भी लुकअप को अड़चन नहीं बनाया।


आपकी विशिष्ट समस्या को गति देने के लिए, मैं या तो वृद्धिशील फ़िल्टरिंग का उपयोग करने का सुझाव देता हूं

arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1)))

यह मानते हुए कि array_of_ksआरोही क्रम में सॉर्ट है, और GaussFilter (और उपयोग करता है, 2 -1 डी फिल्टर निश्चित रूप से) फिल्टर मुखौटा आकार विचरण के आधार पर की गणना करता है, या आप फूरियर अंतरिक्ष, जो बड़े छवियों के लिए विशेष रूप से उपयोगी है में फ़िल्टर कर सकते हैं और प्रसरण हैं समान रूप से दूरी (जो वे सबसे अधिक संभावना दुर्भाग्य से नहीं हैं)।


120

MATLAB के मानचित्र वर्ग का उपयोग करने पर विचार करें: कंटेनर्स .ap । यहाँ एक संक्षिप्त अवलोकन है:

  • सृष्टि:

    >> keys = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', ...
      'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Annual'};
    
    >> values = {327.2, 368.2, 197.6, 178.4, 100.0,  69.9, ...
      32.3,  37.3,  19.0,  37.0,  73.2, 110.9, 1551.0};
    
    >> rainfallMap = containers.Map(keys, values)
    
    rainfallMap = 
      containers.Map handle
      Package: containers
    
      Properties:
            Count: 13
          KeyType: 'char'
        ValueType: 'double'
      Methods, Events, Superclasses
  • देखो:

    x = rainfallMap('Jan');
  • असाइन करें:

    rainfallMap('Jan') = 0;
  • जोड़ें:

    rainfallMap('Total') = 999;
  • हटाना:

    rainfallMap.remove('Total')
  • निरीक्षण:

    values = rainfallMap.values;
    keys = rainfallMap.keys;
    sz = rainfallMap.size;
  • कुंजी की जाँच करें:

    if rainfallMap.isKey('Today')
        ...
    end

7
वाह, मुझे नहीं पता था कि! +1। क्या आप जानते हैं कि वे तार्किक अनुक्रमण की तुलना में बहुत तेज़ हैं या नहीं?
जोनास

3
कंटेनर्स.मैप को MATLAB 7.7 (R2008b) में mathworks.com/access/helpdesk/help/techdoc/rn/brqyzax-1.html देखें । R2010a में नया कुंजी प्रकार के साथ ही मूल्य प्रकार को निर्दिष्ट करने के लिए एक निर्माता है। एम = कंटेनर्स.मैप ('की-टाइप', टाइप, 'वैल्यू टाइप', वीटाइप)
ज़ेल्लस

@ जोनास: मैंने उन्हें बड़े पैमाने पर इस्तेमाल नहीं किया है, यह देखना दिलचस्प होगा कि वे लुकअप के लिए तार्किक अनुक्रमण का उपयोग करने के खिलाफ कैसे तुलना करते हैं ..
एमरो

9
@ zellus, @ amro: क्या यह कष्टप्रद नहीं है कि मतलाब में आदेशों का कोई इतिहास कैसे है?
जोनास

4
लुकअप: वर्षा मानचित्र ('जन'); असाइन करें: वर्षा मानचित्र ('जन') = 'शून्य'; निरीक्षण करें: वर्षावन.पत्रिकाएँ; rainfallMap.keys; rainfallMap.size; कुंजी की जाँच करें: rainMap.isKey ('आज');
इवगेनी सर्गेव

26

Matlab R2008b (7.7) के नए कंटेनर। Map वर्ग java.util.Map इंटरफ़ेस का स्केल-डाउन मैटलैब संस्करण है । इसमें सभी Matlab प्रकारों के साथ सहज एकीकरण का अतिरिक्त लाभ है ( जावा मैप्स उदाहरण के लिए Matlab संरचनाओं को संभाल नहीं सकता है ) और साथ ही डेटा प्रकारों को निर्दिष्ट करने के लिए Matlab 7.10 (R2010a) की क्षमता भी शामिल है।

मुख्य-मूल्य मानचित्र / शब्दकोशों की आवश्यकता वाले गंभीर माटलैब कार्यान्वयन को अभी भी जावा के मैप क्लासेस ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap या Hashtable ) का उपयोग करना चाहिए, यदि प्रदर्शन नहीं है तो अपनी बड़ी कार्यक्षमता तक पहुँच प्राप्त करने के लिए। R2008b की तुलना में पहले के मैटलैब संस्करणों का किसी भी मामले में कोई वास्तविक विकल्प नहीं है और जावा कक्षाओं का उपयोग करना चाहिए।

जावा कलेक्शंस का उपयोग करने की एक संभावित सीमा गैर-आदिम Matlab प्रकार जैसे कि संरचना को शामिल करने में असमर्थता है। इसे दूर करने के लिए, या तो प्रकारों को नीचे-रूपांतरित करें (जैसे, struct2cell या प्रोग्रामेटिक रूप से), या एक अलग जावा ऑब्जेक्ट बनाएं जो आपकी जानकारी को बनाए रखेगा और इस ऑब्जेक्ट को जावा संग्रह में संग्रहीत करेगा।

आपको शुद्ध-मटलब वस्तु-उन्मुख (वर्ग-आधारित) हैशटेबल कार्यान्वयन की जांच करने में भी रुचि हो सकती है, जो फ़ाइल एक्सचेंज पर उपलब्ध है


1
एक और माटलाब वर्ग आधारित कार्यान्वयन आज पोस्ट किया गया: mathworks.com/matlabcentral/fileexchange/28586
Yair Altman

19

आप इसके लिए जावा का उपयोग कर सकते हैं।

मतलाब में:

dict = java.util.Hashtable;
dict.put('a', 1);
dict.put('b', 2);
dict.put('c', 3);
dict.get('b')

लेकिन आपको यह देखने के लिए कुछ रूपरेखा तैयार करनी होगी कि क्या यह आपको गति का लाभ देता है जो मुझे लगता है ...


12

यह थोड़ा कठिन है, लेकिन मुझे आश्चर्य है कि किसी ने भी स्ट्रक्चर्स का उपयोग करने का सुझाव नहीं दिया है। आप चर नाम से किसी भी संरचनात्मक क्षेत्र तक पहुँच सकते हैं struct.(var)जहाँ varकोई भी चर हो सकता है और उचित रूप से हल होगा।

dict.a = 1;
dict.b = 2;

var = 'a';

display( dict.(var) ); % prints 1

1
यदि आप किसी फ़ील्डनाम के रूप में किसी संख्या का उपयोग करते हैं तो यह टूट जाएगा dict.('2'): mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…
Amro

इसके अलावा, चर को पूर्णांक होना चाहिए: dict.(['k',num2str(1)])कार्य करता है, लेकिन dict.(['k',num2str(1.1)])विफल रहता है, और यदि मान पूर्णांक हैं, तो आप उन्हें सीधे अनुक्रमित करने के लिए उपयोग कर सकते हैं। यह एक अच्छा विचार है अन्यथा।
जोनास

@Amro, @ जोनास, उचित बिंदु, अगर चाबियाँ पूर्णांक थीं, तो आपको इस ट्रिक का उपयोग करने की आवश्यकता नहीं होगी (एक सरणी और अधिक समझ में आएगी) ... यदि चाबियाँ मनमानी हैं तो यह थोड़ा अधिक चुनौतीपूर्ण है, लेकिन मैं एक अक्षर के साथ डी उपसर्ग और एक के .साथ बदलें _
मार्क इलियट

6
संरचनाओं का उपयोग करने के साथ उपरोक्त मुद्दों को क्षेत्र के नाम के रूप में जोड़ने से पहले तारों को dict.(genvarname(['k',num2str(1.1)]))
अस्थिर

1

आप नए प्रकार "टेबल" का भी लाभ उठा सकते हैं। आप विभिन्न प्रकार के डेटा संग्रहीत कर सकते हैं और इससे प्राप्त आंकड़े वास्तव में आसान कर सकते हैं। अधिक जानकारी के लिए http://www.mathworks.com/help/matlab/tables.html देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.