में बढ़ती डेटा संरचना मुझे मैटलैब में एक कतार बनाने की आवश्यकता है जो बहुत बड़ी हैं जो structs रखती है। मुझे नहीं पता कि यह कतार कितनी बड़ी होगी। मैटलैब में लिंक्ड सूचियां नहीं हैं, और मुझे चिंता है कि बार-बार आवंटन और प्रतिलिपि वास्तव में इस कोड को धीमा करने जा रही है जिसे हजारों बार चलाया जाना चाहिए। मुझे एक बढ़ने योग्य डेटा संरचना का उपयोग करने के लिए किसी तरह का तरीका चाहिए। मैटलैब सहायता में लिंक्ड सूचियों के लिए मुझे कुछ प्रविष्टियां मिली हैं लेकिन मुझे समझ में नहीं आता कि क्या हो रहा है। क्या इस समस्या में कोई मेरी सहायता कर सकता है?MATLAB
MATLAB
उत्तर
ठीक है, मैं आसान जवाब मिला:
L = java.util.LinkedList;
यदि आप चिंतित हैं कि बार-बार आवंटन और प्रतिलिपि कोड को धीमा करने जा रही है, तो इसे आजमाएं। यह वास्तव में बहुत धीमा हो सकता है, लेकिन आप सुखद आश्चर्यचकित हो सकते हैं।
बस structs की एक सरणी और सरणी के दुगुने आकार बनाने जब यह सीमा को छूता है। यह अच्छी तरह से तराजू।
structs कैसे लागू किए जाते हैं? सरणी को स्थानांतरित करने का मतलब सिर्फ पॉइंटर्स की प्रतिलिपि बनाना है? – rlbond
जहां तक मुझे पता है कि मैटलैब में सबकुछ डेटा है। तो संरचना सिर्फ डेटा है। और आप "सरणी को स्थानांतरित नहीं करते"। मौजूदा सरणी के आकार को बस दोगुना करें। 'एक्स (2 * लंबाई (एक्स)) = ... आपकी 'खाली' संरचना ' – Pyrolistical
@rlbond: हां, MATLAB structs और कक्षों में डेटा स्वयं नहीं है लेकिन डेटा के पॉइंटर्स हैं ताकि सभी ऑपरेशन सस्ते हों। – Mikhail
मैंने कुछ समय पहले a solution पोस्ट किया था। जिस तरह से मैंने कोशिश की वह प्रारंभिक आकार BLOCK_SIZE
के साथ सरणी आवंटित करके है, और फिर मैं BLOCK_SIZE
द्वारा इसे आवश्यकतानुसार बढ़ाना जारी रखता हूं (जब भी 10%*BLOCK_SIZE
से कम स्लॉट होते हैं)।
ध्यान दें कि पर्याप्त ब्लॉक आकार के साथ, प्रदर्शन शुरुआत से पूरी सरणी को आवंटित करने के लिए तुलनीय है। मेरे द्वारा किए गए एक साधारण बेंचमार्क के लिए कृपया दूसरी पोस्ट देखें।
मुझे लगता है कि निर्मित 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 को क्रैश करता है)।
- 1. MATLAB: MATLAB
- 2. कैसे MATLAB में MATLAB
- 3. matlab
- 4. MATLAB
- 5. MATLAB
- 6. MATLAB
- 7. matlab
- 8. Matlab
- 9. matlab
- 10. MATLAB
- 11. MATLAB
- 12. MATLAB
- 13. MATLAB
- 14. matlab
- 15. MATLAB
- 16. Matlab
- 17. Matlab
- 18. matlab
- 19. MATLAB
- 20. Matlab
- 21. MATLAB
- 22. MATLAB
- 23. Matlab
- 24. MATLAB
- 25. MATLAB
- 26. matlab
- 27. MATLAB
- 28. matlab
- 29. matlab
- 30. MATLAB
अफसोस की बात है, मुझे MATLAB प्रोफाइलर के बारे में पता नहीं है। – rlbond
@rlbond: यह वास्तव में दुखद है। यदि आप इसे जानना चाहते हैं, तो मैटलैब के 'डेस्कटॉप' मेनू पर जाएं, और प्रोफाइलर खोलें। – Jonas