MATLAB

2010-04-12 18 views
6

में बढ़ती डेटा संरचना मुझे मैटलैब में एक कतार बनाने की आवश्यकता है जो बहुत बड़ी हैं जो structs रखती है। मुझे नहीं पता कि यह कतार कितनी बड़ी होगी। मैटलैब में लिंक्ड सूचियां नहीं हैं, और मुझे चिंता है कि बार-बार आवंटन और प्रतिलिपि वास्तव में इस कोड को धीमा करने जा रही है जिसे हजारों बार चलाया जाना चाहिए। मुझे एक बढ़ने योग्य डेटा संरचना का उपयोग करने के लिए किसी तरह का तरीका चाहिए। मैटलैब सहायता में लिंक्ड सूचियों के लिए मुझे कुछ प्रविष्टियां मिली हैं लेकिन मुझे समझ में नहीं आता कि क्या हो रहा है। क्या इस समस्या में कोई मेरी सहायता कर सकता है?MATLAB

उत्तर

2

ठीक है, मैं आसान जवाब मिला:

L = java.util.LinkedList; 
2

यदि आप चिंतित हैं कि बार-बार आवंटन और प्रतिलिपि कोड को धीमा करने जा रही है, तो इसे आजमाएं। यह वास्तव में बहुत धीमा हो सकता है, लेकिन आप सुखद आश्चर्यचकित हो सकते हैं।

Beware of premature optimization.

+0

अफसोस की बात है, मुझे MATLAB प्रोफाइलर के बारे में पता नहीं है। – rlbond

+5

@rlbond: यह वास्तव में दुखद है। यदि आप इसे जानना चाहते हैं, तो मैटलैब के 'डेस्कटॉप' मेनू पर जाएं, और प्रोफाइलर खोलें। – Jonas

3

बस structs की एक सरणी और सरणी के दुगुने आकार बनाने जब यह सीमा को छूता है। यह अच्छी तरह से तराजू।

+0

structs कैसे लागू किए जाते हैं? सरणी को स्थानांतरित करने का मतलब सिर्फ पॉइंटर्स की प्रतिलिपि बनाना है? – rlbond

+0

जहां तक ​​मुझे पता है कि मैटलैब में सबकुछ डेटा है। तो संरचना सिर्फ डेटा है। और आप "सरणी को स्थानांतरित नहीं करते"। मौजूदा सरणी के आकार को बस दोगुना करें। 'एक्स (2 * लंबाई (एक्स)) = ... आपकी 'खाली' संरचना ' – Pyrolistical

+0

@rlbond: हां, MATLAB structs और कक्षों में डेटा स्वयं नहीं है लेकिन डेटा के पॉइंटर्स हैं ताकि सभी ऑपरेशन सस्ते हों। – Mikhail

6

मैंने कुछ समय पहले a solution पोस्ट किया था। जिस तरह से मैंने कोशिश की वह प्रारंभिक आकार BLOCK_SIZE के साथ सरणी आवंटित करके है, और फिर मैं BLOCK_SIZE द्वारा इसे आवश्यकतानुसार बढ़ाना जारी रखता हूं (जब भी 10%*BLOCK_SIZE से कम स्लॉट होते हैं)।

ध्यान दें कि पर्याप्त ब्लॉक आकार के साथ, प्रदर्शन शुरुआत से पूरी सरणी को आवंटित करने के लिए तुलनीय है। मेरे द्वारा किए गए एक साधारण बेंचमार्क के लिए कृपया दूसरी पोस्ट देखें।

1

मुझे लगता है कि निर्मित cell संरचना उगने वाली दाढ़ी संरचनाओं के भंडारण के लिए उपयुक्त होगा। मैं के बीच एक तुलना की:

  • गतिशील आकार सेल, सेल का आकार हर पाश में परिवर्तन
  • पूर्व आवंटित सेल
  • जावा LinkedList

कोड:

clear; 
scale = 1000; 

% dynamic size cell 
tic; 
dynamic_cell = cell(0); 
for ii = 1:scale 
    dynamic_cell{end + 1} = magic(20); 
end 
toc 

% preallocated cell 
tic; 
fixed_cell = cell(1, scale); 
for ii = 1:scale 
    fixed_cell{ii} = magic(20); 
end 
toc 

% java linked list 
tic; 
linked_list = java.util.LinkedList; 
for ii = 1:scale 
    linked_list.add(magic(20)); 
end 
toc; 

परिणाम:

Elapsed time is 0.102684 seconds. % dynamic 
Elapsed time is 0.091507 seconds. % pre-allocated 
Elapsed time is 0.189757 seconds. % Java LinkedList 

मैं scale और magic(20) बदलता हूं और गतिशील और पूर्व-आवंटित संस्करण गति पर बहुत करीब हैं। शायद सेल केवल पॉइंटर जैसी संरचनाओं को स्टोर करता है और आकार बदलने पर सक्षम है। जावा रास्ता धीमा है। और मुझे यह कभी-कभी अस्थिर लगता है (जब स्केल बहुत बड़ा होता है तो यह मेरी MATLAB को क्रैश करता है)।