2013-02-28 8 views
5

मैं सफलता के बिना किसी अन्य को स्ट्रक्चर सरणी पास करने की कोशिश कर रहा हूं।एक स्ट्रक्चर सरणी को किसी अन्य स्ट्रक्चर सरणी में कैसे पास किया जाए?

s(1).f = (1:3); 
s(2).f = (4:6); 
s(3).f = (7:9); 

q(1).n = 'nameA'; 
q(2).n = 'nameB'; 
q(3).n = 'nameC'; 
q(3).f = []; 

q.f = s.f 

क्षेत्र n संशोधित नहीं किया जाना चाहिए।

क्या मुझे कुछ याद आती है?

उत्तर

2

आप सीधे एक सेल सरणी structs की एक सरणी के प्रत्येक क्षेत्र प्रदान कर सकते हैं और फिर आप deal उपयोग कर सकते हैं एक सेल सरणी के लिए एक struct कन्वर्ट करने के लिए:

s(1).f = (1:3); 
s(2).f = (4:6); 
s(3).f = (7:9); 

q(1).n = 'nameA'; 
q(2).n = 'nameB'; 
q(3).n = 'nameC'; 

c = cell(3,1); 
[c{:}] = deal(s.f); 
[q.f] = c{:}; 

Here is a good article on this sort of thing

संपादित करें: या के रूप में Shai बताते हैं तुम सिर्फ जा सकते हैं

[q.f] = s.f 
+6

जब आप इसमें हों, तो क्यों न केवल [q.f] = s.f'? – Shai

+1

या यह काम करता है। बहुत बेहतर – Dan

+0

आपकी मदद के लिए सभी को धन्यवाद! शाई संपादन महान काम करता है। लेकिन 'सौदा' कमांड के साथ आपका सुझाव काम नहीं करता है। त्रुटि संदेश है: _ "बाएं हाथ की ओर सी {:} ब्रैकेट के अंदर है, जिसके लिए सी को परिभाषित किया जाना आवश्यक है, ताकि अपेक्षित परिणामों की संख्या की गणना की जा सके" _ – Massoud

2

कैसे arrayfun के बारे में

q = arrayfun(@(x,y) setfield(x, 'f', y.f), q, s); 

जाहिर setfield है केवल struct सरणी में एक struct तत्व की स्थापना के लिए - arrayfun इस प्रकार।

संपादित करें:
एक बेहतर जवाब Dan द्वारा दिए गए।

+0

के बराबर के रूप में आप 'एफ' और 'म' जैसे कई क्षेत्रों के नाम जानने के बिना इस पर लागू कर सकते हैं? तो सभी क्षेत्रों को एस से क्यू में जोड़ें? – Leo

+1

@ लियो आप 'क्षेत्र के नाम] (http://stackoverflow.com/a/15135536/1714410) से विधि को लागू कर सकते हैं,' फ़ील्डनाम 'का उपयोग करके सभी फ़ील्ड पर केवल लूप। – Shai

1

मैं शाई द्वारा इस सुझाव को और अधिक दृश्यमान बनाना चाहता था क्योंकि इसे पढ़ना आसान है।

[q.f] = s.f

1

हालांकि मैं कहेंगे @Dan's answer इस प्रश्न के लिए कैनन सुंदर है, मैं एक विकल्प प्रस्तुत करना चाहता हूं:

s(1).f = (1:3); 
s(2).f = (4:6); 
s(3).f = (7:9); 

[q(1:length(s)).f] = s.f; 

हालांकि [q.f] = s.f वाक्य रचना की तुलना में थोड़ा अधिक वर्बोज़, यह है q को s की प्रतिलिपि बनाने के लिए सही आकार के लिए प्रीलोकेट नहीं किया गया है, भले ही कार्य करने का लाभ अपेक्षित है।

उदाहरण के लिए:

s(1).f = (1:3); 
s(2).f = (4:6); 
s(3).f = (7:9); 

[q.f] = s.f; 

रिटर्न q.f एक 1x1 structs(1).f

संबंधित मुद्दे