2010-10-13 6 views
12

x=1:100 और N=1:10 दें। मैं एक मैट्रिक्स x^N बनाना चाहता हूं ताकि iवें कॉलम में [1 i i^2 ... i^N] प्रविष्टियां हों।लगातार शक्तियों के मैट्रिक्स के निर्माण को वेक्टरराइज करना

मैं आसानी से लूप के लिए इसका उपयोग कर सकता हूं। लेकिन क्या वेक्टरकृत कोड का उपयोग करके ऐसा करने का कोई तरीका है?

+4

+1 इन सभी विभिन्न दृष्टिकोणों को देखने के लिए मौका प्राप्त करने के लिए। – zellus

उत्तर

11

मैं के लिए जाना चाहते हैं:

x = 1:100; 
N = 1:10; 
Solution = repmat(x,[length(N)+1 1]).^repmat(([0 N])',[1 length(x)]); 

एक अन्य समाधान (शायद और अधिक कुशल):

Solution = [ones(size(x)); cumprod(repmat(x,[length(N) 1]),1)]; 

या भी:

Solution = bsxfun(@power,x,[0 N]'); 

आशा इस मदद करता है।

+0

+1 है। यदि आप नियम को कॉम्पैक्टली से व्यक्त कर सकते हैं, तो संभावना है कि संयोजन आपको MATLAB में व्यक्त करेगा ... –

+0

+1 bsxfun() voodoo के लिए +1। @ एड्रियन, मुझे लगता है कि एक टाइपो है: एन = 1:10; एन = 1: 0 के बजाय; – zellus

+0

@ ज़ेलस: सत्य, टाइपो सही – Adrien

2

सुनिश्चित नहीं है कि यह वास्तव में आपके प्रश्न के अनुरूप है या नहीं।

bsxfun(@power, cumsum(ones(100,10),2), cumsum(ones(100,10),1)) 

संपादित करें: के रूप में एड्रियन से कहा, मेरा पहला प्रयास ओपी प्रश्न के अनुरूप नहीं था।

xn = 100; 
N=10; 
solution = [ones(1,xn); bsxfun(@power, cumsum(ones(N,xn),2), cumsum(ones(N,xn),1))]; 
+0

कंप्यूटेक्स मैट्रिक्स की पहली पंक्ति एक होनी चाहिए, आपके मामले में यह bsxfun + फ़ंक्शन पॉइंटर + सरल तर्कों के लिए '1: 100' – Adrien

5

के बाद से अपने मैट्रिक्स कि बड़े नहीं हैं, यह करने के लिए सबसे सीधी-सपाट तरीका MESHGRID उपयोग करने के लिए हो सकता है और element-wise power operator.^:

[x,N] = meshgrid(1:100,0:10); 
x = x.^N; 

यह एक 11-दर-100 मैट्रिक्स जहां प्रत्येक बनाता है कॉलम i में [i^0; i^1; i^2; ... i^10] शामिल है।

+2

अच्छा मेष्रिड उपयोग। इस विधि के साथ मेरी एकमात्र समस्या और यहां प्रस्तावित समान यह है कि वे कम लागत पर लाइन i + 1 की गणना करने के लिए i^th लाइन का उपयोग नहीं करते हैं। Cumprod संस्करण यह करता है लेकिन कुछ सौंदर्यशास्त्र गायब है। – Adrien

+0

@Adrien: बड़े matrices के लिए, आप सही हैं कि आधार मूल्य द्वारा लगातार गुणा द्वारा मूल्यों की गणना करना शायद तेज़ होगा। उदाहरण के लिए अपेक्षाकृत छोटी मैट्रिस के लिए, यह पढ़ने और समझने में आसान कुछ समझने के साथ एक उचित व्यापार-बंद लगता है लेकिन थोड़ा कम कुशल है। ;) – gnovice

+0

मुझे यह विधि पसंद है ... मेरे वास्तविक प्रोग्रामिंग में मैं 10000 से 10000 बना रहा हूं। तो शायद मुझे और अधिक कुशल दृष्टिकोणों का उपयोग करना चाहिए। यद्यपि इस तरह से जानना अच्छा है। धन्यवाद! – alext87

6

एक वंडरमोंड मैट्रिक्स की तरह लगता है। तो vander का उपयोग करें:

A = vander(1:100); 
A = A(1:10, :); 
+0

एकमात्र समस्या यह है कि वेंडर स्क्वायर मैट्रिस बनाता है, इसलिए आप अतिरिक्त काम करते हैं। – gnovice

+0

@gnovice: चारों ओर काम करने के लिए एक बहुत ही मुश्किल समस्या नहीं है, ऊपर कोड देखें। –

+0

दरअसल, चूंकि ओपी ने टिप्पणी में स्क्वायर मैट्रिस के साथ काम करने का उल्लेख किया है, यह फ़ंक्शन एक अच्छी पसंद की तरह दिखता है। आपको केवल एक ही बदलाव करना होगा [ROT90] (http://www.mathworks.com/help/techdoc/ref/rot90.html) का उपयोग करके इसे घुमाएगा ताकि कॉलम 'i' में 'i' की शक्तियां हों। ':' ए = rot90 (vander (1: N)); – gnovice

1

लूप के लिए समझने में आसान क्यों नहीं उपयोग करें?

c = [1:10]'; %count to 100 for full scale problem 
for i = 1:4; %loop to 10 for full scale problem 
    M(:,i) = c.^(i-1) 
end 

लोगों द्वारा दिखाए गए इस कोड के चतुर वेक्टरीकृत संस्करणों को समझने में और अधिक सोच लगती है। मेरा काम करने का एक बर्बर तरीका है, लेकिन इसे पढ़ने वाला कोई भी इसे समझ जाएगा।

मुझे कोड समझना आसान है।

(हाँ, मैं पहले से आवंटित किया जा सकता था। इस तरह छोटे मामलों के लिए उतारा स्पष्टता के लायक नहीं है।)

+2

यदि आप लूप के लिए जाते हैं, तो आपको लाइन द्वारा मैट्रिक्स लाइन भरनी चाहिए और।^ऑपरेटर का उपयोग नहीं करना चाहिए। इसके बजाय पहली पंक्ति को लोगों के साथ भरें और फिर पिछले [1: 100] 'के साथ गुणा करके प्रत्येक नई पंक्ति बनाएं। आपके पास दोनों पठनीयता और दक्षता है। – Adrien

+2

एड्रियान के सुझाव में 12% की गति वृद्धि हुई है। यहां चर्चा की जा रही समस्या के पैमाने के लिए, यह अज्ञान था। मुझे पूरी चीज 2.8 बनाम 2.5 सेकंड लेने के लिए 100,000 बार दौड़ना पड़ा। मेरे लिए, मेरा संस्करण पढ़ने के लिए आसान है क्योंकि एम के लिए कोई दीक्षा कदम नहीं है, लेकिन स्वाद के लिए कोई लेखांकन नहीं है! :) – MatlabDoug

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