2012-06-06 17 views
11

क्या मैं एक लाइनर में निम्नलिखित लिख सकता हूं?मैटलैब सूची समझ

x = [1,3,5] 
res = zeros(1,size(x,2)); 
for i=1:size(x,2); 
    res(i) = foo(x(i); 
end; 

मान लें कि फू फ़ंक्शन अपेक्षा के अनुसार सरणी को संभाल नहीं करता है। मेरे मामले में foo तर्क के रूप में सरणी देते समय भी एक स्केलर देता है।

अजगर में, उदाहरण के लिए, इसे इस तरह दिखेगा:

x = [1,3,5] 
res = [foo(y) for y in x] 

उत्तर

10

arrayfun तुम क्या जरूरत है। उदाहरण के लिए:

res = arrayfun(@foo, x) 

foo के बाद से हमेशा एक अदिश देता है, ऊपर से काम करेंगे और res भी x के रूप में एक ही आयाम का एक वेक्टर हो जाएगा। यदि foo परिवर्तनीय लंबाई आउटपुट देता है, तो आपको पर कॉल में 'UniformOutput' से false या 0 सेट करना होगा। आउटपुट तब cell सरणी होगा।

+1

"@" क्या करता है? –

+1

@ लुसीब्रेनन यह एक [फ़ंक्शन हैंडल] बनाता है (http://www.mathworks.com/help/techdoc/matlab_prog/brfpxgt-1.html)। आप उस दस्तावेज़ पृष्ठ और अधिक जानकारी के लिए संबंधित लिंक – abcd

+1

Thx पढ़ सकते हैं। क्या होगा यदि फू वास्तव में दो तर्क लेता है, और मैं दूसरे तर्क को सभी पुनरावृत्तियों पर स्थिर रखना चाहता हूं? –

6

बस बजाय UniformOutput का उपयोग करने का @yoda का अच्छा जवाब में जोड़ने के लिए, आप भी {} कोष्ठकों का उपयोग कर सकते हैं:

res = arrayfun(@(t){foo(t)}, x) 

इसके अलावा, कुछ अवसरों में, foo पहले से ही vectorized है।

x = 1:10; 
foo = @(t)(power(t,2)); 
res = foo(x); 
+0

के लिए लिंक किए गए दस्तावेज़ को पढ़ सकते हैं, क्या आप थोड़ा और विस्तार से बता सकते हैं कि 'foo = @ (t) (पावर (टी, 2));' मतलब है? –

+0

समस्या यह है कि अगर मैं कुछ करना चाहता हूं जैसे 'i i^2 i to n}'? लेकिन मैं '^ 2' के लिए कोई फ़ंक्शन परिभाषित नहीं करना चाहता, क्या कोई विकल्प है? –

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