2008-10-19 12 views
8

मैं MATLAB के साथ मैट्रिक्स में सभी कॉलम पर एक फ़ंक्शन लागू करना चाहता हूं। उदाहरण के लिए, मैं एक मैट्रिक्स के प्रत्येक कॉलम पर चिकनी कॉल करने में सक्षम होना चाहता हूं, मैट्रिक्स को वेक्टर के रूप में चिकनी तरीके से इलाज करने के बजाय (यदि आप चिकनी (मैट्रिक्स) कहते हैं तो डिफ़ॉल्ट व्यवहार होता है)।MATLAB में मैट्रिक्स के कॉलम के माध्यम से पुनरावृत्ति करने का सबसे अच्छा तरीका क्या है?

मुझे यकीन है कि यह करने के लिए एक और अधिक मुहावरेदार तरह से होना चाहिए हूँ, लेकिन मैं यह नहीं मिल सकता है, तो मैं एक map_column समारोह परिभाषित किया है:

function result= map_column(m, func) 
    result= m; 
    for col= 1:size(m,2) 
     result(:,col)= func(m(:,col)); 
    end 
end 

जो मैं के साथ कॉल कर सकते हैं:

smoothed= map_column(input, @(c) (smooth(c, 9))); 

क्या इस कोड के साथ कुछ गलत है? मैं इसे कैसे सुधार सकता हूं?

उत्तर

3

आपका समाधान ठीक है।

ध्यान दें कि क्षैतिज बड़े matrices के लिए एक पर्याप्त प्रदर्शन दंड सटीक है। यह ओ (एन) के बजाय कोड ओ (एन^2) बनाता है। 100x10,000 मैट्रिक्स के लिए, आपके कार्यान्वयन में मेरी मशीन पर 2.6s लगते हैं, क्षितिज में 64.5 लगते हैं। 100x5000 मैट्रिक्स के लिए, क्षैतिज कार्यान्वयन 15.7 लेता है।

यदि आप चाहते थे, तो आप अपने फ़ंक्शन को थोड़ा सामान्य बना सकते हैं और इसे अंतिम आयाम या यहां तक ​​कि मनमाने ढंग से आयामों (केवल कॉलम) पर फिर से सक्रिय करने में सक्षम नहीं हो सकते हैं।

0

यदि यह आपके फ़ंक्शन के लिए एक सामान्य उपयोग-मामला है, तो इनपुट एक वेक्टर नहीं होने पर फ़ंक्शन को स्वचालित रूप से कॉलम के माध्यम से फिर से बनाने का एक अच्छा विचार होगा।

यह आपकी समस्या का समाधान नहीं करता है लेकिन यह कार्यों के उपयोग को सरल बना देगा। उस स्थिति में, आउटपुट भी एक मैट्रिक्स होना चाहिए।

आप m(:,:) = m(:) का उपयोग कर मैट्रिक्स को एक लंबे कॉलम में भी बदल सकते हैं। हालांकि, यह आपके कार्य पर निर्भर करता है अगर यह समझ में आता है।

2

शायद आप हमेशा 'ऑपरेटर के साथ मैट्रिक्स को बदल सकते हैं और फिर परिणाम को वापस बदल सकते हैं।

smoothed = smooth(input', 9)'; 

कम से कम एफएफटी फ़ंक्शन के साथ काम करता है।

+0

यह चिकनी समारोह के लिए काम नहीं करता। यदि आप चिकनी मैट्रिक्स पास करते हैं, तो यह इसे एक बड़े वेक्टर के रूप में मानता है। हालांकि यह विधि कुछ अन्य कार्यों के लिए सुविधाजनक होगी। – dmnd

10

MATLAB "के लिए" कथन वास्तव में जो भी आपूर्ति की गई है, उसके कॉलम पर लूप करता है - आम तौर पर, यह केवल वेक्टर के उत्तीर्ण होने के बाद स्केलर्स के अनुक्रम में होता है (जैसा कि ऊपर दिए गए उदाहरण में) एक पंक्ति वेक्टर है। इसका मतलब है कि आप इस तरह उपरोक्त कोड को फिर से लिखने कर सकते हैं: समारोह एक स्तंभ वेक्टर वापस नहीं करता है तो

function result = map_column(m, func) 
    result = []; 
    for m_col = m 
     result = horzcat(result, func(m_col)); 
    end 

, तो आप कुछ

f = func(m_col); 
result = horzcat(result, f(:)); 

जैसे कि यह एक स्तंभ में मजबूर करने के लिए जोड़ सकते हैं।

1

यदि आप बड़े matrices से निपट रहे हैं तो परिणाम मैट्रिक्स को प्रीलोकेट करना न भूलें। अन्यथा आपका सीपीयू कई बार चक्रों को फिर से आवंटित करेगा जब भी यह एक नई पंक्ति/कॉलम जोड़ता है।

1

मैट्रिक्स के कॉलम में एक अंतर्निहित पाश का कारण बनने का एक तरीका सेलफन का उपयोग करना है। यही है, आपको पहले मैट्रिक्स को सेल सरणी में परिवर्तित करना होगा, प्रत्येक सेल में एक कॉलम होगा। फिर सेलफन कॉल करें।उदाहरण के लिए:

ए = रैंडन (10,5);

यहां देखें कि मैंने प्रत्येक कॉलम के लिए मानक विचलन की गणना की है।

cellfun (@ एसटीडी, mat2cell (ए, आकार (ए, 1), लोगों को (1, आकार (ए, 2))))

ans = 0,78681 1,1473 0,89789 0,66635 1,3482

के

बेशक, MATLAB में कई फ़ंक्शन पहले से ही एक सरणी की पंक्तियों या स्तंभों पर काम करने के लिए सेट किए गए हैं, जैसा कि उपयोगकर्ता इंगित करता है। यह निश्चित रूप से std के बारे में सच है, लेकिन यह परीक्षण करने का एक सुविधाजनक तरीका है कि सेलफन सफलतापूर्वक काम करता है।

एसटीडी (ए, [], 1)

ans = 0,78681 1,1473 0,89789 0,66635 1,3482

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

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