2009-11-10 10 views
28

वर्षों से, अन्य कोड पढ़ने के बाद, मैंने MATLAB वाक्यविन्यास के कुछ उदाहरणों का सामना किया और एकत्र किया जो पहले असामान्य और counterintuitive पर हो सकता है। कृपया, इस सूची को टिप्पणी करने या पूरक करने के लिए स्वतंत्र महसूस करें। मैंने इसे r2006a के साथ सत्यापित किया।कॉर्नर मामले, अप्रत्याशित और असामान्य MATLAB


MATLAB अपने फोन करने वाले कार्यक्षेत्र में एक समारोह का हमेशा रिटर्न पहले उत्पादन तर्क (अगर यह है कम से कम एक), भी अप्रत्याशित रूप से समारोह myFunc1(); myFunc2(); तरह लौटने तर्क के बिना बुलाया जा रहा है, तो फोन करने वाले कार्यक्षेत्र अभी भी पहले होते हैं myFunc2(); का आउटपुट "अदृश्य" ans चर के रूप में। यदि ans एक संदर्भ वस्तु है तो यह एक महत्वपूर्ण भूमिका निभा सकता है - यह जीवित रहेगा।


set([], 'Background:Color','red') 

MATLAB कभी कभी बहुत क्षमाशील है। इस मामले में, ऑब्जेक्ट्स की सरणी में गुणों को सेट करना, कम से कम जब सरणी खाली होती है, तो बकवास गुणों के साथ भी काम करता है। इस तरह की सरणियों आमतौर पर आ harray = findobj(0,'Tag','NotExistingTag')


myArray([1,round(end/2)]) 

से end कीवर्ड का यह प्रयोग अशुद्ध लगते हैं, लेकिन कभी कभी बहुत बजाय length(myArray) का उपयोग करने का काम हो सकता है।


any([]) ~= all([]) 

Surprisigly any([]) रिटर्न false और all([]) रिटर्न true। और मैंने हमेशा सोचा कि all मजबूत है तो any

संपादित करें:

मूल्यों के उपसमूह के लिए साथ नहीं खाली तर्क all() रिटर्न true जिसके लिए any() रिटर्न true (जैसे सच तालिका)। इसका मतलब है कि any()false का अर्थ all()false है। इस सरल नियम का उल्लंघन MATLAB द्वारा [] के साथ तर्क के रूप में किया जा रहा है।

लॉरेन भी blogged about it


Select(Range(ExcelComObj)) 

प्रक्रियात्मक शैली COM वस्तु विधि प्रेषण। आश्चर्य मत करो कि exist('Select') शून्य लौटाता है!


[myString, myCell] 

MATLAB इस मामले में स्ट्रिंग चर myString कोशिका प्रकार {myString} के एक अंतर्निहित डाली बनाता है। यह काम करता है, भले ही मैं ऐसा करने की अपेक्षा नहीं करता।


[double(1.8), uint8(123)] => 2 123 

एक और उदाहरण डाली। सभी शायद uint8 मूल्य double पर डाले जाने की उम्मीद करेंगे लेकिन गणित की एक और राय है।चेतावनी के बिना यह व्यवहार बहुत खतरनाक है।


a = 5; 
b = a(); 

यह मूर्खतापूर्ण लग रहा है, लेकिन आप दौर ब्रैकेट के साथ एक चर कॉल कर सकते हैं। असल में यह समझ में आता है क्योंकि इस तरह आप अपने हैंडल दिए गए फ़ंक्शन को निष्पादित कर सकते हैं।


सिंटेक्स Foo(:) डेटा पर, लेकिन यह भी काम करता है अगर, Bar.Foo(:) के रूप में बुलाया इस परिदृश्य में समारोह इनपुट तर्क चार बृहदान्त्र':' के रूप में पारित हो जाता है के साथ न केवल काम करता है।

उदाहरण के लिए Bar.Foo = @(x) disp(x) अब MATLAB कमांड विंडो में Bar.Foo(:) प्रिंट ':' पर कॉल करें।

यह अजीब विशेषता चेतावनियों के बिना सभी MATLAB 7 संस्करणों के साथ काम करती है।


a = {'aa', 'bb' 
'cc', 'dd'}; 

Surprsisingly इस कोड को न तो एक वेक्टर देता है और न ही एक त्रुटि बढ़ जाता है लेकिन मैट्रिक्स defins, बस कोड लेआउट का उपयोग कर। यह शायद प्राचीन काल से एक रिश्ते है।

संपादित करें: बहुत आसान सुविधा, gnovice द्वारा टिप्पणी देखें।


set(hobj, {'BackgroundColor','ForegroundColor'},{'red','blue'}) 

इस कोड को आप शायद यह क्या करने की आशा करता है। यह कार्य set एक स्ट्रक्चर स्वीकार करता है क्योंकि इसका दूसरा तर्क एक ज्ञात तथ्य है और समझ में आता है, और यह सिंटैक्स सिर्फ cell2struct दूर है।


समीकरण नियम कभी-कभी अप्रत्याशित होते हैं। उदाहरण के लिए 'A'==65 सत्य लौटाता है (हालांकि सी-विशेषज्ञों के लिए यह स्वयं स्पष्ट है)। इसी तरह isequal([],{}) अपेक्षित, false और isequal([],'')true लौटाता है।

स्ट्रिंग-न्यूमेरिक तुल्यता मतलब है कि सभी स्ट्रिंग काम करता है, संख्यात्मक सरणियों के लिए भी इस्तेमाल किया जा सकता है, उदाहरण के एक बड़े सरणी में एक उप सरणी के सूचकांक को खोजने के लिए:

ind = strfind([1 2 3 4 1 2 3 4 1 2 3 4 ], [2 3]) 

MATLAB समारोह isnumeric() बूलियन के लिए false लौटाता है। यह सिर्फ लगता है ... झूठी :-)


जो के बारे में आगे अप्रत्याशित/असामान्य MATLAB सुविधाओं कि आप जानते हैं?

+1

मेरा मानना ​​है कि इस मामले में सामुदायिक विकी की आवश्यकता है, क्योंकि यह मूल रूप से "सूची-संकलन" सर्वेक्षण प्रश्न है। – gnovice

+1

@gnovice: समुदाय विकी – Mikhail

+9

में बदल गया "आश्चर्यजनक रूप से कोई भी ([]) झूठा लौटाता है और सभी ([]) सत्य लौटते हैं।" मुझे समझ में नहीं आता कि इस बारे में क्या आश्चर्यजनक है; मुझे यह पूरी तरह से स्पष्ट लगता है। – Timwi

उत्तर

5

सरणी बनाम कोशिकाओं

आइए कुछ बुनियादी वाक्य रचना के साथ शुरू करने के लिए पर नजर डालते हैं। तत्वों के साथ सरणी बनाने के लिए , बी, सी आप [a b c] लिखते हैं।एरे , बी, सी के साथ एक सेल बनाने के लिए आप {A B C} लिखते हैं। अब तक सब ठीक है।

सरणी तत्वों तक पहुंच इस तरह की जाती है: arr(i)। कोशिकाओं के लिए, यह cell{i} है। फिर भी अच्छा।

अब आइए तत्व को हटाने का प्रयास करें। सरणी के लिए: arr(i) = []। उपर्युक्त उदाहरणों से बाहर निकलना, आप कोशिकाओं के लिए cell{i} = {} आज़मा सकते हैं, लेकिन यह वाक्यविन्यास त्रुटि है। सेल के तत्व को हटाने के लिए सही वाक्यविन्यास वास्तव में, उसी वाक्यविन्यास का उपयोग करता है जो आप सरणी के लिए उपयोग करते हैं: cell(i) = []

तो, अधिकांश समय जब आप विशेष वाक्यविन्यास का उपयोग करके कोशिकाओं तक पहुंचते हैं, लेकिन आइटम को हटाते समय आप सरणी वाक्यविन्यास का उपयोग करते हैं।

यदि आप गहरी खुदाई करते हैं तो आप पाएंगे कि वास्तव में एक सेल एक सरणी है जहां प्रत्येक मान एक निश्चित प्रकार का होता है। तो आप अभी भी cell(i) लिख सकते हैं, आपको बस {A} (एक मूल्यवान सेल!) मिल जाएगा। cell{i} सीधे A पुनर्प्राप्त करने के लिए एक शॉर्टेंड है।

यह सब बहुत सुंदर आईएमओ नहीं है।

+5

सेल व्यवहार वास्तव में काफी संगत है: arr (i) सरणी के ith तत्व को वापस करता है। एक संख्यात्मक सरणी के मामले में, ith तत्व संख्यात्मक स्केलर होता है, सेल सरणी के मामले में, ith तत्व एक स्केलर सेल होता है, एक स्ट्रक्चर सरणी के मामले में ith तत्व स्केलर संरचना होती है। घुंघराले ब्रैकेट का उपयोग सेल में 'खोदने' के लिए किया जाता है, जैसे फ़ील्ड नामों को संरचना में 'खोदने' के लिए उपयोग किया जाता है। इसके अलावा, संरचनाओं की तरह, आप सेल सेल की सामग्री के तत्वों तक पहुंचने के लिए आगे बढ़ सकते हैं, जैसे सेलअरे {i} (1,2) – Jonas

8

अजीब MATLAB वाक्यविन्यास के उदाहरणों को सूचीबद्ध करने के बजाय, मैं इस प्रश्न में कुछ उदाहरणों को संबोधित करूंगा जो मुझे लगता है कि मुझे लगता है या अपेक्षित/दस्तावेज/वांछित व्यवहार है।

  • कैसे ANY और ALL संभाल खाली तर्क:

    any([]) का परिणाम समझ में आता है: वहाँ इनपुट वेक्टर में कोई गैर शून्य तत्व हैं (क्योंकि यह खाली है), तो यह गलत देता है। inArray के तत्वों से अधिक

    function allAreTrue = my_all(inArray) 
        allAreTrue = true; 
        N = numel(inArray); 
        index = 1; 
        while allAreTrue && (index <= N) 
        allAreTrue = (inArray(index) ~= 0); 
        index = index + 1; 
        end 
    end 
    

    इस समारोह लूप जब तक यह एक है कि शून्य है मुठभेड़ों:

    all([]) का परिणाम बेहतर तरीके से इस समारोह के अपने स्वयं के संस्करण को लागू कर सकते हैं के बारे में सोच से समझा जा सकता। यदि inArray खाली है, तो लूप कभी दर्ज नहीं होता है और allAreTrue का डिफ़ॉल्ट मान वापस कर दिया जाता है।

  • कक्षाओं के विपरीत श्रृंखलाबद्ध:

    जब एक सरणी में विभिन्न प्रकार के श्रृंखलाबद्ध, MATLAB एक preset precedence of classes इस प्रकार है और उसके अनुसार मूल्यों बदल देता है। सामान्य प्राथमिकता क्रम (उच्चतम से निम्नतम तक) है: char, integer (किसी भी संकेत या बिट्स की संख्या), single, double, और logical। यही कारण है कि [double(1.8), uint8(123)] आपको uint8 का परिणाम देता है। पूर्णांक प्रकारों के विपरीत संयोजन (uint8, int32, आदि), left-most matrix element determines the type of the result।एक पंक्ति में प्रवेश करने और अगली पंक्ति पर अगली पंक्ति दर्ज करने के बाद

    जब एक से अधिक पंक्तियों के साथ एक मैट्रिक्स का निर्माण, तो आप बस हिट कर सकते हैं वापसी एक का उपयोग किए बिना: line continuation operator (...) का उपयोग किए बिना

  • अनेक पंक्तियां लाइन जारी रखने के लिए semicolon एक नई पंक्ति या ... परिभाषित करने के लिए। निम्नलिखित घोषणाएं बराबर हैं:

    a = {'aa', 'bb' 
    'cc', 'dd'}; 
    
    a = {'aa', 'bb'; ... 
    'cc', 'dd'}; 
    
    a = {'aa', 'bb'; 'cc', 'dd'}; 
    

    आप MATLAB को ऐसा क्यों व्यवहार करना चाहते हैं? एक कारण मैंने देखा है कि यह डेटा को काट और पेस्ट करना आसान बनाता है, उदाहरण के लिए, MATLAB कमांड विंडो में एक चर में Excel दस्तावेज़। निम्न का प्रयास करें:

    • Excel फ़ाइल में कोई क्षेत्र चुनें और इसकी प्रतिलिपि बनाएँ।
    • a = [ 0LABमें पर वापस किए बिना MATLAB टाइप करें।
    • MATLAB कमांड विंडो पर राइट-क्लिक करें और "पेस्ट" चुनें।
    • टाइप ]; और हिट रिटर्न। अब आपके पास एक चर a है जिसमें Excel फ़ाइल में चुनी गई पंक्तियों और स्तंभों का डेटा शामिल है, और जो डेटा के "आकार" को बनाए रखता है।
+1

मुझे लगता है कि यह इंगित करने में मदद करता है कि क्यों "सभी ([])" लोगों को भ्रमित करते हैं - ऐसा इसलिए है क्योंकि "सब" तर्कसंगत/प्रोग्रामिंग में रोज़मर्रा की भाषा में अलग-अलग काम करता है। मैंने प्रश्न पर एक टिप्पणी के रूप में एक उदाहरण पोस्ट किया है। –

+0

कम से कम, पूर्णांक के विपरीत संगतता एक त्रुटि फेंकता है (r2010a) – Jonas

12

छवि निर्देशांक बनाम साजिश निर्देशांक मुझे हर बार प्राप्त करने के लिए प्रयोग किया जाता है।

%# create an image with one white pixel 
img = zeros(100); 
img(25,65) = 1; 

%# show the image 
figure 
imshow(img); 

%# now circle the pixel. To be sure of the coordinate, let's run find 
[x,y] = find(img); 
hold on 
%# plot a red circle... 
plot(x,y,'or') 
%# ... and it's not in the right place 

%# plot a green circle with x,y switched, and it works 
plot(y,x,'og') 

संपादित करें 1

सरणी आयाम

चर कम से कम दो आयाम है। स्केलर आकार [1,1] हैं, वैक्टर आकार [1,n] या [n,1] हैं। इस प्रकार, ndims उनमें से किसी के लिए 2 लौटाता है (वास्तव में, ndims([]) 2 भी है, क्योंकि size([])[0,0] है)। यह आपके इनपुट की आयामता के लिए परीक्षण करने के लिए थोड़ा बोझिल बनाता है। 1 डी सरणी की जांच करने के लिए, आपको isvector का उपयोग करना होगा, 0 डी सरणी को isscalar की आवश्यकता है।

संपादित 2

सरणी कार्य

आम तौर पर, मैटलैब सरणी कार्य के साथ सख्त है।उदाहरण के लिए

m = magic(3); 
m(1:2,1:3) = zeros(3,2); 

फेंकता एक

??? Subscripted assignment dimension mismatch. 

हालांकि, इन काम:

m(1:2,1:2) = 1; %# scalar to vector 
m(2,:) = ones(3,1); %# vector n-by-1 to vector 1-by-n (for newer Matlab versions) 
m(:) = 1:9; %# vector to 'linearized array' 

संपादित 3

को गलत तरीके से सरणियों गुड लक इस डिबगिंग आकार के साथ तार्किक अनुक्रमण !

लॉजिकल इंडेक्सिंग find पर कॉल करने लगती है, क्योंकि आपके लॉजिकल सरणी को इंडेक्स के समान तत्वों की आवश्यकता नहीं होती है!

>> m = magic(4); %# a 4-by-4 array 
>> id = logical([1 1 0 1 0]) 
id = 
    1  1  0  1  0 
>> m(id,:) %# id has five elements, m only four rows 
ans = 
    16  2  3 13 
    5 11 10  8 
    4 14 15  1 
%# this wouldn't work if the last element of id was 1, btw 

>> id = logical([1 1 0]) 
id = 
    1  1  0 
>> m(id,:) %# id has three elements, m has four rows 
ans = 
    16  2  3 13 
    5 11 10  8 
संबंधित मुद्दे