2012-10-09 23 views
5

में वैक्टरों का एक हैशमैप बढ़ाना मुझे मैटलैब में हैशपैप जैसी कार्यक्षमता की आवश्यकता है, जहां हैशैप मानचित्र अन्य वैक्टरों के वैक्टरों को मानचित्र करता है, और वैक्टरों की संख्या (सैकड़ों हजारों में) पहले से ज्ञात नहीं है।मैटलैब

मैंने मैटलैब के इनबिल्ट Containers.Map को आजमाया, लेकिन यह वैक्टर को चाबियों के रूप में स्वीकार नहीं करता है। तब मैं java.util.HashMap की कोशिश की:

>> map = java.util.HashMap; 
>> map.put(1:3,zeros(2,1)); 
>> map.get(1:3) 

ans = 

[] 

तो कुछ कारण यह है कि काम करने के लिए प्रतीत नहीं होता है, भले ही जावा के HashMap सरणियों को सरणियों मैप करने के लिए सक्षम होना चाहिए के लिए।

दूसरा विकल्प दो अलग मैट्रिक्स, चाबियों के लिए एक और मूल्यों के लिए एक रखना होगा, और उन्हें वृद्धिशील रूप से बढ़ाना होगा। लेकिन मैं वास्तव में ऐसा नहीं करना चाहता हूं क्योंकि बढ़ती चीजों के माटलैब में दर्द बढ़ रहा है (ब्लॉक आकार वृद्धि आदि के साथ भी, उदाहरण के लिए here)।

प्रश्न: 1. जावा का हैश मैप यहां क्यों काम नहीं करता है? 2. कोई अन्य दृष्टिकोण?

धन्यवाद।

+2

जांचें http://stackoverflow.com/questions/1352553/how-can-i-use-matlab-arrays-as-keys-to-the-hashmap-java-objects – Rasman

+1

में मूल्यों की श्रृंखला क्या है कुंजी वैक्टर? यदि वे 2^16 के तहत स्याही हैं, तो आप उन्हें केवल 'char' में परिवर्तित कर सकते हैं और परिणामी मजाकिया तारों को चाबियों के रूप में उपयोग कर सकते हैं। –

+0

आपके उत्तरों के लिए धन्यवाद। मुख्य वैक्टर वास्तव में 2^16 के तहत इनट्स हैं इसलिए मैंने कंटेनर का उपयोग करके तुलना की।चार कुंजी और जावा के हैश मैप के साथ नक्शा रस्मान के समान कुंजियों के साथ मानचित्र से जुड़ा हुआ है: ठीक है, यहां पोस्ट करने के लिए यह बहुत अधिक कोड है इसलिए मैं इसे एक उत्तर के रूप में पोस्ट करूंगा। – Matt

उत्तर

4

यहां एक क्लज है जो आप चाहते हैं। । ।

map = java.util.HashMap;  
key = java.util.Vector; 

matKey = 1:3; 
for nn=1:numel(matKey) 
    key.add(matKey(nn)); 
end 

map.put(key,zeros(2,1)); 
map.get(key) 

.. यह वैसे भी एक प्रारंभिक बिंदु है।

+1

यह काम कर सकता है, और "क्लेज" से बेहतर हो सकता है, लेकिन आपको सावधान रहना होगा - जावा ऑब्जेक्ट इंस्टेंस को 'कुंजी' में पुन: उपयोग करके थोड़ा धोखा दे रहा है, जब मुझे लगता है कि ओपी प्रविष्टियों को खींचने में सक्षम होना चाहता है मूल्य। ओपी का कोड काम नहीं करता है क्योंकि मैटलैब '1: 3' जावा आदिम डबल सरणी में परिवर्तित हो जाता है, जिसमें समानता-दर-पहचान अर्थशास्त्र होता है। आपका पहला उदाहरण काम करेगा यदि आप एक वेक्टर ऑफ डबल्स के साथ समाप्त होते हैं, जिसमें समानता-दर-मूल्य अर्थशास्त्र होगा। सुनिश्चित नहीं है कि रूपांतरण कैसे होगा; आपको 'key.add (java.lang.Double (matKey (nn)) करके इसे मजबूर करने की आवश्यकता हो सकती है);'। –

+1

दूसरा उदाहरण शायद काम नहीं करेगा - 'key.add (1: 3) 'डबल [] के एक लंबे वेक्टर के साथ समाप्त होता है, जो समानता-दर-पहचान के साथ समाप्त होता है। मुझे नहीं लगता कि आप एक अलग '1: 3' का उपयोग कर मूल्य वापस खींचने में सक्षम होंगे; आपको मूल 'कुंजी' ऑब्जेक्ट की आवश्यकता होगी। जैसे यदि आप 'key2 = java.util.Vector करते हैं; key2.add (1: 3); map.get (key2) ', क्या यह मान पुनर्प्राप्त करता है? क्योंकि मुझे लगता है कि ओपी को काम करने के लिए इसकी आवश्यकता होगी। –

+0

@AndrewJanke आप सही थे। परीक्षण के बाद, Kludge 2 वास्तव में काम नहीं किया था। हटाया गया – learnvst

1

मैंने कंटेनर की तुलना की। मैप.यूटिल के साथ मैप.यूटिल। हैश मैप के साथ मैप के साथ मैप (this post में, एंड्रयू जंक के लिए भी धन्यवाद, और रस्मान को धन्यवाद देने के लिए धन्यवाद) :

numvec = 10^5; 
S = round(rand(numvec,10)*40); 

matmap = containers.Map(); 
%pick a random vector 
idx = ceil(rand()*numvec); 
s1 = S(idx,:); 

%put it in the map 
matmap(char(s1)) = zeros(1,4); 
for i=1:5*10^5 

    if i==10^3 tic; end %allow some time for getting up to speed before timing 

    %pick a random vector and put it in the map 
    idx = ceil(rand()*numvec); 
    s2 = S(idx,:); 
    matmap(char(s2)) = zeros(1,4); 

    %retrieve value of previous vector 
    v = matmap(char(s1)); 

    %modify it randomly and put it back 
    v(ceil(rand()*4)) = rand(); 
    matmap(char(s1)) = v; 

    s1 = s2; 
end 
toc 

javaaddpath('/Test/bin'); 
import test.ArrayKey; 
javmap = java.util.HashMap; 

idx = ceil(rand()*numvec); 
s1 = S(idx,:); 

%also convert value to ArrayKey so we can retrieve it by ref -- saves a put 
%operation 
javmap.put(ArrayKey(s1), ArrayKey(zeros(1,4))); 
for i=1:5*10^5 

    if i==10^3 tic; end 

    idx = ceil(rand()*numvec); 
    s2 = S(idx,:); 
    javmap.put(ArrayKey(s2), ArrayKey(zeros(1,4))); 
    v = javmap.get(ArrayKey(s1)); 
    v.x(ceil(rand()*4)) = rand(); 
    s1 = s2; 
end 
toc 

परिणाम:

>> testmaps 
Elapsed time is 58.600282 seconds. 
Elapsed time is 97.617556 seconds. 

containers.Map विजेता है।


संपादित करें: मैं numvec = 10^6 और बाकी सब कुछ के लिए परीक्षण फिर से चलाता हूं। कंटेनर। मैप दृष्टिकोण 59 सेकंड में चला गया। हैश मैप दृष्टिकोण 5 मिनट के बाद समाप्त नहीं हुआ और मैटलैब को उत्तरदायी बनने का कारण बन गया।


EDIT2: मैं भी दो अलग-अलग मैट्रिक्स पूर्व आवंटन और ismember का उपयोग कर कुंजी खोजने के की कोशिश की। प्रदर्शन हैश मैप से भी बदतर था।

+0

कूल। यह समझ में आता है कि कंटेनर। मैप आउटपरफॉर्म: एम-कोड से प्रत्येक जावा कॉल पर ओवरहेड है, और मुख्य रूपांतरण कुंजी कॉल के साथ बढ़ते हुए कई कॉल का उपयोग करता है। –

0

मुझे हाल ही में एक ही समस्या का सामना करना पड़ा, न कि वैक्टरों के साथ बल्कि सरणी के साथ।

मैटलैब में एक फ़ंक्शन mat2str फ़ंक्शन है जो एक मैट्रिक्स को स्ट्रिंग में परिवर्तित करता है। यदि आपको हैश मैप में गतिशील रूप से बढ़ने के लिए वैक्टरों की आवश्यकता नहीं है, तो आप वेक्टर को स्ट्रिंग के रूप में प्रस्तुत कर सकते हैं और अपनी कुंजी/मान के रूप में उपयोग कर सकते हैं। कुछ स्थितियों में यह शायद बहुत उपयोगी नहीं है, लेकिन अगर चीजें स्थिर हैं तो यह एक त्वरित और गंदा समाधान है।