2010-03-18 9 views
5

में वेक्टर/मैट्रिक्स के सदस्यों पर कॉल मैं पाश दुनिया (सी, आदि)Loopless समारोह मैटलैब/सप्टक

मैं एक वेक्टर/मैट्रिक्स के प्रत्येक व्यक्ति के सदस्य पर एक समारोह कॉल करना चाहते हैं से मैट्रिक्स दुनिया में आया, और परिणामस्वरूप वेक्टर/मैट्रिक्स वापस करें।

इस तरह मैं वर्तमान में यह कार्य करें:

function retval = gauss(v, a, b, c) 
    for i = 1:length(v) 
    retval(i) = a*(e^(-(v(i)-b)*(v(i)-b)/(2*c*c))); 
    endfor 
endfunction 

उदाहरण उपयोग:

octave:47> d=[1:1000]; 
octave:48> mycurve=gauss(d, 1, 500, 100); 

अब, MATLAB/सप्टक पर सभी सलाह का कहना है: बंद करो, जब भी आप अपने आप को छोरों का उपयोग कर पकड़ने और एक के बारे में सोच इसे करने का बेहतर तरीका।

इस प्रकार, मेरा प्रश्न: क्या कोई वेक्टर/मैट्रिक्स के प्रत्येक सदस्य पर एक फ़ंक्शन कॉल कर सकता है और परिणाम को स्पष्ट लूप का उपयोग किए बिना एक बार में एक नए वेक्टर/मैट्रिक्स में वापस कर सकता है?

है कि मैं कुछ इस तरह रहा हूँ:

function retval = newfun(v) 
    retval = 42*(v^23); 
endfunction 

शायद, यह सिर्फ वाक्यात्मक चीनी है, वह सब है, लेकिन अभी भी पता करने के लिए उपयोगी होगा।

+0

वाह, तेज़ प्रतिक्रिया लोगों के लिए धन्यवाद! कुछ नया सीखना अच्छा लगा :) – Sint

उत्तर

6

समारोह इस तरह दिखना चाहिए:

function retval = gauss(v, a, b, c) 
    retval = a*exp(-(v-b).^2/(2*c^2)); 

मैं कैसे कोड vectorize करने पर MATLAB प्रलेखन पढ़ सकते हैं और छोरों से बचने के लिए आप की सिफारिश करेंगे:

Code Vectorization Guide

Techniques for Improving Performance

यह भी याद रखें कि लूप के साथ कभी-कभी कोड अधिक स्पष्ट हो सकता है कि वेक्टरकृत एक और हाल ही में जेआईटी कंपाइलर MATLAB के परिचय के साथ लूप बहुत अच्छी तरह से संबंधित है।

+0

धन्यवाद! अभी गाइड पढ़ना। – Sint

+0

ऑक्टैव, हालांकि, अभी भी लूपिंग के बजाय वेक्टरिंग से बहुत लाभान्वित हैं। Arrayfun का उल्लेख करने के लिए – mtrw

1

हां।

function retval = newfun(v) 
    retval = a*exp(-((v-b).^2)/(2*c*c)); 
endfunction 
6

मैटलैब में '।' ऑपरेटरों पर उपसर्ग तत्व-वार ऑपरेशन है। इस तरह

कोशिश कुछ:

function r = newfun(v) 
r = a.*exp(-(v-b).^2./(2*c^2)) 
end 
3

ARRAYFUN (और इसके रिश्तेदार) ऐसा करने का सामान्य तरीका है।

लेकिन अपने विशेष मामले में, तुम सिर्फ कर सकते हैं

mycurve = a*exp(-(d-b).^2/(2*c^2)); 

यह सिर्फ वाक्यात्मक चीनी नहीं है; लूप को समाप्त करने से आपका कोड काफी तेज़ हो जाता है।

+0

+1 – gaborous