2012-12-05 15 views
6

मैं अब एक संरचनाMatlab: स्ट्रक्चर मज़े का उपयोग करके "जगह में" संरचना फ़ील्ड को कैसे अपडेट करें?

s.a = [1 2 3]; 
s.b = [2 3 4 5]; 
s.c = [9, 6 ,3]; 
s.d = ... % etc. - you got the gist of it 

है मैं क्षेत्र की सामग्री को संशोधित, वह यह है कि मैं

s.a = myFun(s.a); 
s.b = myFun(s.b); 
s.c = myFun(s.c); % etc. ... 
लागू करना चाहते हैं प्रत्येक क्षेत्र और में संग्रहीत डेटा पर एक समारोह/आपरेशन लागू करना चाहते हैं

उपर्युक्त सभी फ़ील्ड स्पष्ट रूप से लिखने के बिना मैं इसे कैसे कर सकता हूं? मैं structfun के बारे में सोच रहा था - लेकिन मुझे यकीन नहीं है कि इस "जगह में" संशोधन को कैसे पूरा किया जाए ...

धन्यवाद!

उत्तर

7

अधीर पाठक के लिए, structfun समाधान मेरा उत्तर :-) के नीचे स्थित है लेकिन मैं पहले अपने आप को पूछना होगा ...

क्या एक पाश का उपयोग कर के साथ गलत क्या है? निम्न उदाहरण से पता चलता है कि यह कैसे किया जा सकता है:

%# An example structure 
S.a = 2; 
S.b = 3; 

%# An example function 
MyFunc = @(x) (x^2); 

%# Retrieve the structure field names 
Names = fieldnames(S); 

%# Loop over the field-names and apply the function to each field 
for n = 1:length(Names) 
    S.(Names{n}) = MyFunc(S.(Names{n})); 
end 

मैटलैब कार्यों ऐसे arrayfun और cellfun आम तौर पर are slower than an explicit loop के रूप में। मुझे लगता है कि structfun शायद एक ही समस्या से पीड़ित है, तो परेशान क्यों? `Cellfun` के क्रम के बारे में

%# structfun solution 
S.a = [2 4]; 
S.b = 3; 
MyFunc = @(x) (x.^2); 
S = structfun(MyFunc, S, 'UniformOutput', 0); 
+0

बहुत दिलचस्प बिंदु:

हालांकि, अगर आप structfun इस प्रकार के रूप में यह किया जा सकता है का उपयोग कर पर जोर देते हैं (मैं उदाहरण के एक छोटे से अधिक व्यापकता पर जोर देना जटिल सिर्फ बनाया) और 'सरणी'। मैं अभी भी 'structfun' की तरफ झुका हुआ हूं क्योंकि मुझे लगता है कि यह लूप की तुलना में अधिक "सुरुचिपूर्ण" है। मुझे यह भी लगता है कि यह कोड की पठनीयता में योगदान देता है। तुम्हारे सुझाव के लिए धन्यवाद! – Shai

+1

@Shai मेला पर्याप्त है। मैंने 'structfun' समाधान को शामिल करने के लिए अपना उत्तर अपडेट कर दिया है। अगर आपको लगता है कि मैंने सवाल का जवाब दिया है, तो टिक टिक पर क्लिक करने के लिए स्वतंत्र महसूस करें। अन्यथा, मुझे बताएं और शायद मैं इसे सुधार सकता हूं। चीयर्स :-) –