ম্যাটল্যাবে হ্যাশ টেবিল


92

ম্যাটল্যাবের কি হ্যাশ টেবিলগুলির জন্য কোনও সমর্থন আছে?


কিছু পটভূমি

আমি মতলব-তে এমন একটি সমস্যা নিয়ে কাজ করছি যার জন্য কোনও চিত্রের স্কেল-স্পেস উপস্থাপনা প্রয়োজন। এটি করার জন্য আমি কিছু পরিসরের sigma*s^kজন্য বৈকল্পিক সহ একটি 2-ডি গাউসিয়ান ফিল্টার তৈরি করি kand এখন, আমি kফিল্টার করা চিত্র থেকে কিছু ধরণের ম্যাপিং চাই want

যদি kসর্বদা পূর্ণসংখ্যার হয় তবে আমি কেবল একটি 3D অ্যারে তৈরি করতাম যে:

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) এর পরিবর্তে O (1) হয়।


এখন, আমি জানি যে আমার অকালিকল্পিতভাবে অপ্টিমাইজ করা উচিত নয় এবং আমার এ সমস্যাটি মোটেই নাও হতে পারে, তবে মনে রাখবেন এটি কেবল ব্যাকগ্রাউন্ড, এবং এমন ঘটনাও ঘটতে পারে যেখানে এটি সত্যিই সেরা সমাধান, তা নির্বিশেষে হোক না কেন আমার সমস্যার সর্বোত্তম সমাধান

উত্তর:


14

মতলব হ্যাশ টেবিলের জন্য সমর্থন করে না। সম্পাদনা r2010a পর্যন্ত, যে হয়; দেখতে @Amro এর উত্তর।

আপনার চেহারাটিকে গতি বাড়ানোর জন্য, আপনি ড্রপ করতে পারেন findএবং লজিকাল সূচকটি ব্যবহার করতে পারেন ।

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হচ্ছে আরোহী ক্রমে সাজানো হয়েছে, এবং গাউসফিল্টার বৈকল্পিক (এবং ব্যবহারগুলি, অবশ্যই 2 1D ফিল্টারগুলি অবশ্যই) এর উপর ভিত্তি করে ফিল্টার মাস্ক আকারের গণনা করে, বা আপনি ফুরিয়ার স্পেসে ফিল্টার করতে পারেন, যা বিশেষত বড় চিত্রগুলির জন্য দরকারী এবং যদি রূপগুলি হয় সমানভাবে ব্যবধানযুক্ত (যা তারা সম্ভবত দুর্ভাগ্যক্রমে নয়)।


120

ম্যাটল্যাব এর মানচিত্রে বর্গ ব্যবহার বিবেচনা করুন: containers.Map । এখানে একটি সংক্ষিপ্ত বিবরণ দেওয়া হল:

  • সৃষ্টি:

    >> 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 তারা কি লজিক্যাল ইনডেক্সিংয়ের চেয়ে অনেক দ্রুত গতিতে জানেন?
জোনাস

4
কনটেইনারস.ম্যাপটি ম্যাটল্যাব 7.7 এ যুক্ত করা হয়েছিল (আর ২০০২ বি) ম্যাথওয়ার্কস / অ্যাক্সেস / হেল্পডেস্ক / শেলপ / টেকডোক / আরএন / ব্রাকাইজ্যাক্সএইচটিএমএল দেখুন । নতুন ইন R2010a মূল প্রকারের পাশাপাশি মানের ধরণ নির্দিষ্ট করার জন্য এক নির্মাণকারী। এম = ধারক। মানচিত্র ('কী টাইপ', কে টাইপ, 'ভ্যালু টাইপ', ভিটাইপ)
জেলাস

@ জোনাস: আমি এগুলি ব্যাপকভাবে ব্যবহার করি নি, দেখার জন্য তারা যৌক্তিক সূচী ব্যবহারের সাথে কীভাবে তুলনা করে তা দেখতে আকর্ষণীয় হবে ..
আম্রো

9
@ জেলাস, @ আম্রো: মতলবটিতে কমান্ডের ইতিহাস নেই কী তা বিরক্তিকর নয়?
জোনাস

4
চেহারা: বৃষ্টিপাতের মানচিত্র ('জান'); বরাদ্দ করুন: વરસાદের ম্যাপ ('জান') = 'শূন্য'; পরিদর্শন: বৃষ্টিপাতের মানচিত্র; মূল্য; વરસાદের ম্যাপ.কিজ; rainMap.size; চেক কী: વરસાદের ম্যাপ.আইসকে ('আজ');
এভেজেনি সার্জিভ

26

মতলব R2008b (7.7) এর নতুন containers.Map বর্গ একটি ছোটো-ডাউন মতলব সংস্করণ java.util.Map ইন্টারফেস। এটি সমস্ত মতলব প্রকারের সাথে বিরামবিহীন সংহতকরণের অতিরিক্ত সুবিধা পেয়েছে ( জাভা মানচিত্রগুলি উদাহরণস্বরূপ মতলব স্ট্রাক্টগুলি পরিচালনা করতে পারে না ) পাশাপাশি তথ্য প্রকার নির্দিষ্ট করে দেওয়ার জন্য মতলব 10.১০ (আর -2010 এ) এর ক্ষমতাও রয়েছে ।

গুরুতর মতলব বাস্তবায়নের কী-মান মানচিত্রগুলি প্রয়োজন / অভিধান এখনও জাভার ম্যাপ শ্রেণীর (ব্যবহার করা উচিত java.util.EnumMap , HashMap , TreeMap , LinkedHashMap বা hashtable তাদের বৃহত্তর কার্যকারিতা লাভ অ্যাক্সেস করতে) যদি না কর্মক্ষমতা। আর200200 বি এর আগের মতলব সংস্করণগুলির কোনও ক্ষেত্রেই আসল বিকল্প নেই এবং অবশ্যই জাভা ক্লাস ব্যবহার করা উচিত।

জাভা সংগ্রহগুলি ব্যবহারের একটি সম্ভাব্য সীমাবদ্ধতা হ'ল স্ট্রাক্টের মতো অ-আদিম মতলব ধরণের ধারণায় তাদের অক্ষমতা। এ থেকে উত্তরণের জন্য, হয় প্রকারগুলি ডাউন-রূপান্তর করুন (উদাহরণস্বরূপ, স্ট্রাক্ট 2 সেল বা প্রোগ্রাম্যাটিকভাবে ব্যবহার করে), অথবা একটি পৃথক জাভা অবজেক্ট তৈরি করুন যা আপনার তথ্য ধারণ করবে এবং জাভা সংগ্রহের মধ্যে এই অবজেক্টটি সংরক্ষণ করবে।

আপনি ফাইল এক্সচেঞ্জ-এ উপলব্ধ একটি খাঁটি-মতলব অবজেক্ট-ভিত্তিক (শ্রেণিভিত্তিক) হ্যাশটেবল বাস্তবায়নও পরীক্ষা করতে আগ্রহী হতে পারেন ।



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

4
যদি আপনি কোনও ক্ষেত্রের নাম হিসাবে কোনও নম্বর ব্যবহার করেন তবে তা ভঙ্গ হবে dict.('2'):: mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…
আম্রো

এছাড়াও, ভেরিয়েবলগুলি পূর্ণসংখ্যা হতে হবে: dict.(['k',num2str(1)])কাজ করে তবে dict.(['k',num2str(1.1)])ব্যর্থ হয় এবং মানগুলি পূর্ণসংখ্যা হয়, আপনি এগুলি সরাসরি সূচীতে ব্যবহার করতে পারেন। এটি অন্যথায় একটি দুর্দান্ত ধারণা।
জোনাস

@ আম্রো, @ জোনাস, ন্যায্য পয়েন্টগুলি, কীগুলি যদি পূর্ণসংখ্যার হয় তবে আপনার এই কৌশলটি ব্যবহার করার দরকার পড়েনি (একটি অ্যারে আরও বুদ্ধিমান হতে পারে) ... কীগুলি যদি নির্বিচারে ভাসমান হয় তবে এটি কিছুটা চ্যালেঞ্জিং, তবে আমি একটি অক্ষর সহ উপসর্গ এবং একটি .সঙ্গে প্রতিস্থাপন _
মার্ক এলিয়ট

6
কাঠামো ব্যবহার করে উপরের সমস্যাগুলি ক্ষেত্রের নাম হিসাবে যুক্ত করার আগে স্ট্রিংগুলি বৈচিত্র্যকরণের মাধ্যমে এড়ানো যেতে পারে:dict.(genvarname(['k',num2str(1.1)]))
foglerit

1

আপনি নতুন ধরণের "টেবিল" এর সুবিধাও নিতে পারেন। আপনি বিভিন্ন ধরণের ডেটা সঞ্চয় করতে পারেন এবং এটি থেকে পরিসংখ্যানগুলি পাওয়া খুব সহজ। আরও তথ্যের জন্য http://www.mathworks.com/help/matlab/tables.html দেখুন ।

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