कारण यह है कि आपके उदाहरण में structs ठीक से प्रारंभ नहीं होते हैं यह है कि आप जिस वाक्यविन्यास का उपयोग कर रहे हैं वह केवल स्ट्रक्चर सरणी में अंतिम तत्व को संबोधित करता है। एक nonxistent सरणी के लिए, उनमें से बाकी सूत्रों के साथ पूरी तरह से भर जाते हैं जिनके पास अपने सभी क्षेत्रों में डिफ़ॉल्ट मान []
है।
इस व्यवहार स्पष्ट करने के लिए, clear edges; edges(1:3) = struct('weight',1.0)
के साथ एक लघु सरणी कर रहे हैं और edges(1)
, edges(2)
, और edges(3)
में से प्रत्येक में देखने का प्रयास करें।edges(3)
तत्व में आपके वजन में 1.0
है जैसा आप चाहते हैं; अन्य []
है।
स्ट्रक्चर की सरणी को कुशलतापूर्वक प्रारंभ करने के लिए वाक्यविन्यास इनमें से एक है।
% Using repmat and full assignment
edges = repmat(struct('weight', 1.0), [1 1000]);
% Using indexing
% NOTE: Only correct if variable is uninitialized!!!
edges(1:1000) = struct('weight', 1.0); % QUESTIONABLE
नोट के बजाय सिर्फ 1000
जब अप्रारंभीकृत किनारों सरणी में सूचीबद्ध करने में 1:1000
।
edges(1:1000)
फ़ॉर्म में कोई समस्या है: यदि edges
पहले ही प्रारंभ हो चुका है, तो यह वाक्यविन्यास केवल चयनित तत्वों के मान अपडेट करेगा। यदि किनारों में 1000 से अधिक तत्व हैं, तो दूसरों को अपरिवर्तित छोड़ा जाएगा, और आपका कोड खराब हो जाएगा। या यदि edges
एक अलग प्रकार है, तो आप अपने मौजूदा डेटाटाइप के आधार पर एक त्रुटि या अजीब व्यवहार प्राप्त कर सकते हैं। सुरक्षित होने के लिए, आपको इंडेक्सिंग सिंटैक्स का उपयोग शुरू करने से पहले clear edges
करना होगा। इसलिए repmat
फ़ॉर्म के साथ पूर्ण असाइनमेंट करना बेहतर है।
लेकिन: आप इसे कैसे प्रारंभ की परवाह किए बिना, एक इस तरह सरणी के- structs हमेशा पैदायशी बड़े डेटा सेट के लिए साथ काम करने के धीमी गति से होने जा रहा है। आप इस पर वास्तविक "वेक्टरकृत" संचालन नहीं कर सकते हैं क्योंकि आपके आदिम सरणी सभी को प्रत्येक संरचना तत्व के अंदर अलग mxArrays में विभाजित कर दिया जाता है। इसमें आपके प्रश्न में फ़ील्ड असाइनमेंट शामिल है - इसे सदिश बनाना संभव नहीं है। इसके बजाय, आपको ब्रायन एल के उत्तर जैसे स्ट्रक्चर-ऑफ-एरे स्विच करना चाहिए।
स्रोत
2014-03-17 16:53:16
यह पोस्ट सहायता की हो सकती है: http://stackoverflow.com/questions/4166438/how-do-i-define-a-structure-in-matlab/4169216#4169216 – Amro