2013-04-19 10 views
5

मैंने मैटलैब और ऑक्टेट में कई मामलों को देखा है जहां कार्य मैट्रिस और वैक्टर दोनों स्वीकार करते हैं, लेकिन मैट्रिस के साथ वैक्टर के साथ वही काम नहीं करते हैं।ऑक्टेव और मैटलैब "wat" मैट्रिक्स/वेक्टर असंगतता

यह निराशाजनक हो सकता है क्योंकि जब आप पंक्तियों/स्तंभों की एक चर संख्या के साथ एक मैट्रिक्स इनपुट करते हैं, तो इसे एक वेक्टर के रूप में व्याख्या किया जा सकता है और ऐसा कुछ ऐसा करने की अपेक्षा नहीं करता है जब ऊंचाई/चौड़ाई मुश्किल डीबगिंग के लिए 1 हो और अजीब सशर्त किनारे के मामले।

मैं कुछ मैंने पाया सूचीबद्ध करेंगे, लेकिन क्या दूसरों लोगों में

(नोट चलाने मैं उत्सुक हूँ:। मैं केवल मामलों में जहां कोड मान्य इनपुट के रूप में मैट्रिक्स को स्वीकार करता है के लिए देख रहा हूँ कुछ भी एक अपवाद जब एक गैर वेक्टर मैट्रिक्स के रूप में एक बहस में नहीं गिना जाता दिया जाता है) को जन्म देती है

1) "diag" एक मैट्रिक्स के विकर्ण मतलब या एक विकर्ण मैट्रिक्स

बाद में एक सदिश चालू करने के लिए इस्तेमाल किया जा सकता पूर्व आमतौर पर केवल स्क्वायर मैट्रिस के लिए उपयोग किया जाता है, यह मैटलैब में इतना गंभीर नहीं है, लेकिन ऑक्टेव में यह विशेष रूप से दर्दनाक हो सकता है जब ऑक्टेव एक छेड़छाड़ करता है एक अशून्य तत्व और एक "विकर्ण मैट्रिक्स" यानी के रूप में सब कुछ किसी और शून्य से ctor शुरुआत

t=eye(3); 
size(diag(t(:,3))) == [3,3] 
size(diag(t(:,2))) == [3,3] 
size(diag(t(:,1))) == [1,1] 

2) Logicals के साथ एक पंक्ति-वेक्टर में सूचीबद्ध किया जा रहा Logicals रिटर्न के साथ कुछ और में एक पंक्ति-वेक्टर

अनुक्रमण रिटर्न एक स्तंभ वेक्टर

a = 1:3; 
b = true(1,3); 
size(a(b)) == [1, 3] 
a = [a; a]; 
b = [b; b]; 
size(a(b)) == [6, 1] 

3) एक सूचकांक वेक्टर मैं एक ही (पंक्तियां/स्तंभ का एक वेक्टर रिटर्न के साथ एक वेक्टर वी में अनुक्रमण) वी के रूप में टाइप करें। लेकिन अगर या तो वी या मैं एक मैट्रिक्स है, वापसी मान मेरे जैसा ही आकार है।

a = 1:3; 
b = a'; 
size(a(b)) == [1, 3] 
b = [b,b]; 
size(a(b)) == [3, 2] 

4) अधिकतम, न्यूनतम, योग आदि एक मैट्रिक्स एम के स्तंभों पर काम individiually जब तक एम 1xN है जो मामले में वे एक ही पंक्ति-वेक्टर

a = 1:3 
size(max(a)) == [1, 1] 
a = [a;a] 
size(max(a)) == [1, 3] 

अधिकतम के रूप में एम पर काम विशेष रूप से खराब है क्योंकि यह एक तर्क के रूप में एक आयाम भी नहीं ले सकता है (योग के विपरीत)

ऑक्टेट/मैटलैब कोड लिखते समय मुझे ऐसे अन्य मामलों को देखना चाहिए?

+0

बस स्पष्ट करने के लिए: आप अधिकतम/न्यूनतम: 'मिनट (रैंड (3), [], 1)' या 'अधिकतम (रैंड (3), [], 2)' – Amro

उत्तर

1

प्रत्येक भाषा की अपनी अवधारणाएं होती हैं। इस भाषा का एक महत्वपूर्ण बिंदु मैट्रिस के बारे में अक्सर वैक्टरों की एक सरणी के रूप में सोचना है, प्रत्येक कॉलम एक प्रविष्टि है। चीजें तब समझने लगेंगी। यदि आप उस व्यवहार को नहीं चाहते हैं, तो matrix(:) का उपयोग उन कार्यों के तर्क के रूप में करें जो एक मैट्रिक्स के बजाए एक एकल वेक्टर पास करेंगे। उदाहरण के लिए:

octave> a = magic (5); 
octave> max (a) 
ans = 

    23 24 25 21 22 

octave> max (a(:)) 
ans = 25 

1) यह कम से कम ऑक्टैव 3.6.4 के साथ सच नहीं है। मैं 100% निश्चित नहीं हूं लेकिन this bug से संबंधित हो सकता है जो पहले ही तय हो चुका है।

2) यदि आप बुलियन मूल्यों के साथ अनुक्रमित करते हैं, तो यह एक मुखौटा माना जाएगा और इस तरह व्यवहार किया जाएगा। यदि आप गैर-बूलियन मानों के साथ अनुक्रमित करते हैं, तो इसे मानों के लिए अनुक्रमणिका के रूप में माना जाता है। यह मेरे लिए सही समझ में आता है।

3) यह सच नहीं है। लौटा हमेशा इंडेक्स का एक ही आकार होता है, अगर यह मैट्रिक्स या वेक्टर होता है तो स्वतंत्र होता है। एकमात्र अपवाद यह है कि यदि सूचकांक एक वेक्टर है, तो आउटपुट एक पंक्ति होगी।

octave> a = 4:7 
a = 

    4 5 6 7 

octave> a([1 1]) 
ans = 

    4 4 

octave> a([1 3]) 
ans = 

    4 6 

octave> a([1 3; 3 1]) 
ans = 

    4 6 
    6 4 

4) max तर्क कम से कम सप्टक में के रूप में आयाम ले करता है: विचार यह है कि एक भी वेक्टर/मैट्रिक्स के साथ अनुक्रमण एक ही आकार के कुछ देता है। max के 3.6.4 सहायता पाठ से:

वेक्टर तर्क के लिए, अधिकतम मान वापस करें। एक मैट्रिक्स तर्क के लिए, एक पंक्ति वेक्टर, या आयाम डीआईएम के रूप में परिभाषित होने पर प्रत्येक कॉलम से अधिकतम मान वापस करें, जिस स्थिति में वाई को खाली मैट्रिक्स पर सेट किया जाना चाहिए (इसे अन्यथा अनदेखा किया गया है)।

शेष परिचय जैसे मैंने परिचय पर कहा। यदि आप एक मैट्रिक्स की आपूर्ति करते हैं, तो यह प्रत्येक कॉलम को डेटासेट के रूप में सोचेंगे।

+2

के लिए आयाम निर्दिष्ट कर सकते हैं लगता है कि आप समझ गए कि मैं किस बारे में पूछ रहा था। मैं आम तौर पर शिकायत कर रहा था कि वैक्टरों को मैट्रिस के रूप में नहीं माना जाता है (जबकि आपको लगता है कि मेरी समस्या यह थी कि मैट्रिस को वैक्टर के रूप में नहीं माना जाता है) 2 मामले में, मैं केवल बूलियन के साथ अनुक्रमण कर रहा हूं, कभी भी संख्याओं के साथ नहीं (किसी भी मामले में नहीं), फिर भी एक पंक्ति वेक्टर और दूसरा कॉलम वेक्टर देता है। मामले में 3, अपवाद जो आप उल्लेख करते हैं वह वही है जो मैं शिकायत कर रहा हूं। अगर मेरे पास एक मैट्रिक्स है जिसे मुझे इंडेक्स करने की आवश्यकता है लेकिन मैट्रिक्स में कॉलम की एक चर संख्या है, तो मुझे केवल एक अपवाद के लिए एक कथन कथन लिखना होगा – dspyz

0

1) जैसा कि अन्य उपयोगकर्ता द्वारा इंगित किया गया है, यह ऑक्टवे> = 3.6.4 पर सच नहीं है।

मामले 2) नियम वैक्टर के लिए है में, हमेशा वेक्टर का एक ही आकार वापसी, और एक स्तंभ वेक्टर लौट भी चीज के लिए, पर विचार करें:

>> a = reshape (1:3, 1,1,3) 

a(:,:,1) = 

    1.0000e+000 


a(:,:,2) = 

    2.0000e+000 


a(:,:,3) = 

    3.0000e+000 

>> b = true(1,3) 

b = 

    1×3 logical array 

    1 1 1 

>> a(b) 

ans(:,:,1) = 

    1.0000e+000 


ans(:,:,2) = 

    2.0000e+000 


ans(:,:,3) = 

    3.0000e+000 

>> a = [a;a] 

a(:,:,1) = 

    1.0000e+000 
    1.0000e+000 


a(:,:,2) = 

    2.0000e+000 
    2.0000e+000 


a(:,:,3) = 

    3.0000e+000 
    3.0000e+000 

>> b = [b;b] 

b = 

    2×3 logical array 

    1 1 1 
    1 1 1 

>> a(b) 

ans = 

    1.0000e+000 
    1.0000e+000 
    2.0000e+000 
    2.0000e+000 
    3.0000e+000 
    3.0000e+000 

आप देख सकते हैं कि यह समझ में आता है के बाद से वैक्टर एक है स्पष्ट 'दिशा' लेकिन अन्य आकार के matrices जब आप तत्वों को हटाते हैं। संपादित करें: असल में मैंने अभी जांच की है और ऑक्टेव इस तरह से काम नहीं करता है, लेकिन शायद यह चाहिए।

3) यह 2 के साथ संगत है)। अनिवार्य रूप से यदि आप सूचकांक की एक सूची की आपूर्ति करते हैं तो अनुक्रमित वेक्टर की दिशा संरक्षित है। यदि आप मैट्रिक्स जैसे आकार के साथ इंडेक्स की आपूर्ति करते हैं, तो नई जानकारी इंडेक्स मैट्रिक्स आकार का उपयोग किया जाता है। यह अधिक लचीला है, क्योंकि यदि आप चाहें तो a के आकार को संरक्षित रखने के लिए आप हमेशा a(b(:)) कर सकते हैं। आप कह सकते हैं कि यह सुसंगत नहीं है, लेकिन याद रखें कि लॉजिकल के साथ अनुक्रमणित करने से तत्वों की संख्या कम हो सकती है, इसलिए उन्हें इस तरह से दोबारा नहीं बदला जा सकता है।

4) जैसा कि एक टिप्पणी में बताया गया है, आप अधिकतम/न्यूनतम के लिए आयाम निर्दिष्ट कर सकते हैं: min(rand(3),[],1) या max(rand(3),[],2), लेकिन इस मामले में इन कार्यों के साथ 'विरासत' मुद्दे हैं जो डेटा पहले वापस थे बनाया और अब लोगों को परेशान किए बिना बदलना बहुत मुश्किल है।

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