2011-05-25 16 views
5

मैं MATLAB में OOP के साथ चारों ओर खेल रहा हूँ की सरणी को प्रारंभ, और मैं निम्नलिखित निर्माता है: अस्थायी चर 'एक' भयानक बदबू आ रही हैmatlab वस्तुओं

 
function obj = Squadron(num_fighters, num_targets, time_steps)    
    if nargin == 0 
     num_targets = 100; 
     time_steps = 100; 
     num_fighters = 10; 
    end 
    obj.num_shooters = num_fighters; 
    for iShooter = 1:obj.num_shooters 
     a(iShooter) = Shooter(num_targets, time_steps); 
    end 
    obj.ShooterArray = a; 
    obj.current_detections = zeros(num_fighters, num_targets); 
end 

है। वस्तुओं की एक सरणी शुरू करने का एक बेहतर तरीका है, मेरी इच्छा है कि एक पुश/पॉप विधि थी। मुझे यकीन है कि ऐसा करने का एक बेहतर तरीका है।

+0

हैरानी की बात है आप भी 'सीधे आवंटित कर सकते हैं' में Shooter' निर्माता Shooter' सरणी: http://www.mathworks.com /help/techdoc/matlab_oop/brd4btr.html – Mikhail

+0

मैं इसे कन्स्ट्रक्टर में आवंटित कर रहा हूं, क्या आप अस्थायी चर का उपयोग करने के बजाय इसे करने के क्लीनर तरीके से जानते हैं? शायद मुझे कुछ याद आ रही है। – bonhoffer

+0

"क्लीनर रास्ता" व्यक्तिपरक है ... मेरा संदेश: यह न केवल 'स्क्वाड्रन' में काम करता है बल्कि सीधे 'शूटर' कन्स्ट्रक्टर में भी काम करता है। – Mikhail

उत्तर

10

लग रहा है। मेरे पास बहुत similar problem discussion है जो आपकी मदद कर सकता है।

संक्षेप में: आप जो कर रहे हैं वह सुंदर नहीं हो सकता है - लेकिन शायद पहले से ही बहुत अच्छा हो सकता है।

मैटलैब में एक सरणी बनाते समय आमतौर पर आरक्षित स्मृति के लिए कुछ पूर्व-आवंटन करने का एक अच्छा विचार है जो प्रदर्शन को काफी हद तक गति देता है।

इस तरह एक सामान्य मामला कुछ में:

a=zeros(1,1000); 
for n=1:1000 
    a(n)=n; 
end 

(यहाँ एक = 1: 1000; होगा और भी बेहतर)

वस्तुओं के लिए करने के लिए वस्तुओं की एक सौंप कर पूर्व आवंटन काम करता है सरणी में बहुत आखिरी क्षेत्र। Matlab उसके बाद अन्य क्षेत्रों को वस्तुओं (हैंडल) के साथ भर देता है जो कि उस वस्तु के निर्माता को बिना किसी तर्क के बुलाता है (Matlab help देखें)।इसलिए वस्तुओं के लिए एक पूर्व आवंटन ऐसा दिखाई दे सकता:

a(1,1000)=ObjectConstructor(); 
for n=1:1000 
    a(n)=ObjectConstructor(); 
end 

या बस

for n=1000:-1:1 
    a(n)=ObjectConstructor(); 
end 

यकीन है कि शूटर बनाना कोई तर्क के साथ कहा जा सकता है कि आप की तरह कुछ करने के लिए सक्षम होना चाहिए:

for iShooter = obj.num_shooters:-1:1 
    obj.ShooterArray(iShooter) = Shooter(num_targets, time_steps); 
end 

हालांकि, यह पता चला है कि किसी कारण से किसी अन्य ऑब्जेक्ट की संपत्ति में ऑब्जेक्ट्स की सरणी का प्रत्यक्ष भंडारण बहुत खराब प्रदर्शन करता है। (शायद इस मामले में सरणी आवंटन अच्छी तरह से काम नहीं करता है)। इसलिए एक सहायक चर का उपयोग करना और संपत्ति के लिए एक बार में पूर्ण सरणी आवंटित करना इस मामले में प्रदर्शन बढ़ाने के लिए एक अच्छा विचार है।

मैं कोशिश करेंगे:

for iShooter = obj.num_shooters:-1:1 
    a(iShooter) = Shooter(num_targets, time_steps); 
end 
obj.ShooterArray = a; 

फिर से - और अधिक विस्तार के लिए देख this discussion

4

तरीके इस स्थिति को संभालने के लिए की एक जोड़ी रहे हैं ...

  • Building object arrays in the constructor:

    आप अपने Shooter वर्ग को संशोधित कर सकता है इस तरह के हैं कि जब आप मूल्यों की सरणियों पारित यह ऑब्जेक्ट की श्रृंखला पैदा करता है। तो फिर तुम इतने तरह ShooterArray प्रारंभ कर सकते हैं:

    एक मूल्य वर्ग के
    obj.ShooterArray = Shooter(repmat(num_targets,1,num_fighters),... 
              repmat(time_steps,1,num_fighters)); 
    
  • प्रतिकृति कर उदाहरणों:

    तो Shooter एक value class है, और प्रत्येक वस्तु बिल्कुल एक ही होने जा रहा है (यानी आप इसके किसी भी डिफ़ॉल्ट गुण को यादृच्छिक मानों में प्रारंभ न करें), फिर आप केवल एक ऑब्जेक्ट बना सकते हैं और इसे REPMAT:

    obj.ShooterArray = repmat(Shooter(num_targets,time_steps),1,num_fighters); 
    
    का उपयोग करके दोहराना शुरू कर सकते हैं

    दुर्भाग्यवश, यदि Shooterhandle class का उप-वर्ग है, तो आप इसे मूल्य श्रेणी के साथ ही दोहराना नहीं कर सकते हैं। आप वास्तव में संदर्भ को केवल एक ऑब्जेक्ट में प्रतिलिपि बनाते हैं, जब आपको वास्तव में अपने स्वयं के अद्वितीय संदर्भ के साथ कई अलग-अलग वस्तुओं की आवश्यकता होती है। ऐसे मामले में, आपका वर्तमान कोड संभवतः सबसे अच्छा समाधान है। आप संभाल वस्तुओं (निशानेबाजों) की एक सरणी बना सकते हैं और एक और संभाल वस्तु (एक Squardron) की संपत्ति के अंदर यह स्टोर करने के लिए कोशिश कर रहे हैं की तरह