2012-04-25 11 views
14

मैं MATLAB में दो वैक्टरों को इंटरव्यू करना चाहता हूं। असल में, मैं वास्तव में प्रत्येक तत्व के बीच शून्य जोड़ना चाहता हूं, लेकिन मुझे लगा कि मैं इस तरह से सवाल पूछूंगा कि मैं सीखूंगा कि इसे अन्य परिस्थितियों में कैसे लागू किया जाए।इंटरविविंग वैक्टर

मेरा विशिष्ट अनुप्रयोग: मैं एक वेक्टर लेना चाहता हूं (उदा। [1 2 3]) और आउटपुट [0 1 0 2 0 3]

व्यापक प्रश्न: मैं इसे दो अलग-अलग वैक्टरों के साथ कैसे करूं, उदा। [1 2 3] और [9 8 7][9 1 8 2 7 3] का उत्पादन करने के लिए इंटरविविंग।

उपर्युक्त प्रश्नों में से किसी एक या दोनों में किसी भी मदद की बहुत सराहना की गई।

उत्तर

8

प्रयास करें यहाँ कुछ कोड है कि पूरा होगा तुम क्या चाहते हो:

nums = 

    0.9134 0.6324 0.0975 


output = 

     0 0.9134   0 0.6324   0 0.0975 

अन्य दो जवाब की शैली के बाद:

nums = rand(1,3) 
output = zeros(1,2*numel(nums)); 
output(2:2:end) = nums 

उत्पादन पीछा कर रहा है , आप निम्नलिखित के साथ अपने वांछित शून्य आउटपुट प्राप्त कर सकते हैं:

nums = rand(1,3); 
reshape([zeros(size(nums));nums],1,[]) 

जाहिर है, nums को वेक्टर के साथ प्रतिस्थापित किया जाना चाहिए जिसका आप उपयोग करना चाहते हैं। जैसा कि बताया गया है, आपको यह सुनिश्चित करना चाहिए कि यह reshape पर कॉल करने से पहले एक पंक्ति वेक्टर है।

+1

यह एक पंक्ति वेक्टर की गारंटी के लिए, आप' nums (:) '' – Jonas

+0

' reshape' समाधान बहुत ही सुरुचिपूर्ण है! – Anael

10

reshape([[9 8 7];[1 2 3]],1,[]) 
+0

मुझे वास्तव में यह समाधान पसंद है, लेकिन दस्तावेज़ीकरण को देखते हुए, मुझे कोई गारंटी नहीं है कि यह फ़ंक्शन सभी इनपुट के लिए या फ़ंक्शन के भविष्य के कार्यान्वयन के लिए इस तरह से व्यवहार करेगा। विशेष रूप से, ऐसा लगता है कि केवल यह गारंटी देने के लिए कि: "reshape (X, SIZ) एक्स के समान तत्वों के साथ एक एन-डी सरणी देता है लेकिन आकार SIZ के लिए पुनः आकार दिया जाता है।" –

+0

@ जैकोबली: 'reshape' का उपयोग उपयोग करने के लिए सुरक्षित है। पहला तर्क एक मैट्रिक्स है, एक 1 के बाद और एक फीताधारक हमेशा 1xn के लिए reshapes। – Daniel

+0

पंक्ति और कॉलम इनपुट के लिए काम करने वाला एक और सामान्य संस्करण 'reshape ([ए (:)।'; बी (:)। '], 1, []) ' – Daniel

25

मैं MATLAB वैक्टर के आंतरिक लेआउट का उपयोग करता हूं: वे कॉलम-प्रमुख संग्रहीत होते हैं, यानी कॉलम में मूल्य सबसे तेज़ी से बदलते हैं। दो वैक्टर a और b, बिछा करने के लिए बस कार्य करें:

ar = a(:)'; % make sure ar is a row vector 
br = b(:)'; % make sure br is a row vector 
A = [ar;br]; % concatenate them vertically 
c = A(:);  % flatten the result 
+0

ट्रिविअल, लेकिन इसे एक पंक्ति वेक्टर वापस करने के लिए, निश्चित रूप से आखिरी पंक्ति को बदल सकते हैं: 'c = ए (:) ';' –

+2

'' '' के बजाय '.'' का प्रयोग करें, अन्यथा यह काम नहीं करेगा जटिल संख्या के साथ। – Daniel

4

मैं एक MATLAB समारोह फ़ाइल Exchange साइट (Interleave Vectors or Matrices) करता है कि वास्तव में क्या आप और अधिक चाहते हैं पर है कि लिखा था। बस .m फ़ाइल डाउनलोड करें और फ़ाइल को अपनी अन्य .m फ़ाइलों के समान निर्देशिका में रखें, या फ़ंक्शन को अपने प्रोग्राम में कॉपी और पेस्ट करें।

यह फ़ंक्शन पंक्ति या स्तंभ द्वारा किसी भी संख्या में वैक्टर या मैट्रिस को अंतःस्थापित करता है। यदि इनपुट केवल वैक्टर हैं, तो अभिविन्यास निर्दिष्ट करने की कोई आवश्यकता नहीं है। आउटपुट मैट्रिक्स के अंत में अतिरिक्त तत्व/पंक्तियां/स्तंभ जोड़े गए हैं। प्रदान किए गए अन्य उत्तर बराबर लंबाई के वैक्टरों के लिए बहुत विशिष्ट हैं या यह सुनिश्चित करने की आवश्यकता है कि वैक्टरों का अभिविन्यास सही है।

1) मैट्रिक्स

A = [1 2; 3 4] B = [5 6;7 8] 

C = interleave2(A, B, 'row') 
C = [1 2 
    5 6 
    3 4 
    7 8] 

2 की इंटरलिविंग पंक्तियाँ) मैट्रिक्स

C = interleave2(A, B, 'col') 
C = [1 5 2 6 
    3 7 4 8] 

3) वैक्टर इंटरलिविंग (नोट के स्तंभों इंटरलिविंग:

कैसे समारोह का उपयोग करने के के उदाहरण इनपुट वैक्टरों को समान अभिविन्यास की आवश्यकता नहीं होती है)

A = [1 2 3 4] B = [5 6 7 8 9]' 
C = interleave2(A, B) 
C = [1 5 2 6 3 7 4 8 9]' 

4) Interleaving> 2 मैट्रिक्स

A = [1 2;3 4] B = [5 6;7 8] 
C = [9 10;11 12] D = [13 14;15 16] 

E = interleave2(A, B, C, D, 'col') 
E = [1 5 9 13 2 6 10 14 
    3 7 11 15 4 8 12 16] 

5) असमान कॉलम

A = [1 2;3 4] 
B = [5 6 7 8;9 10 11 12] 
C = interleave2(A, B, 'col') 
C = [1 5 2 6 7 8 
    3 9 4 10 11 12] 

6) Interleaving> असमान लंबाई की 2 वैक्टर

A = [1 2 3 4] B = [5 6 7] 
C = [8 9 10 11 12 13] 
D = interleave2(A, B, C) 
D = [1 5 8 2 6 9 3 7 10 4 11 12 13] 
4

के लिए के साथ 2 मैट्रिक्स के कॉलम इंटरलिविंग सबसे सरल मामला एक ही लाइनर के साथ काफी "सुरुचिपूर्ण" समाधान है जैसा कि this answer में एक समान प्रश्न में वर्णित है।

a = [9 8 7]; 
b = [1 2 3]; 
output = kron(a, [1 0]) + kron(b, [0 1]); 

के रूप में इस सवाल का जवाब में कहा गया है कि इस बारे में पता होना है कम कुशल लेकिन एक अधिक सामान्य उद्देश्य बस के रूप में यह Kronecker product कि दो मैट्रिक्स के बीच अच्छी तरह से परिभाषित किया गया है का उपयोग करता है interleaving से के लिए प्रस्तुत कर सकते हैं।

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