2016-09-07 13 views
7

मैटलैब में कई साजिश कार्य शामिल हैं जो अक्ष के लिए हैंडल को संभालने के लिए वैकल्पिक तर्क लेते हैं। वहाँ कई समाधान हालांकि वे आम तौर पर की आवश्यकता है कि वैकल्पिक तर्क केवल अनिवार्य बहस के बाद आते हैं, matlab में कार्यों की साजिश रचने, जबकि आम तौर पर के रूप में हैं, उपयोगकर्ता परिभाषित कार्यों (varargin, inputParser) के लिए वैकल्पिक तर्क जोड़ने के लिए ऑनलाइन कर रहे हैंमैटलैब - फंक्शंस के लिए पहले वैकल्पिक हैंडल तर्क

plot(optional, mandatory, optional) 

यही है, वैकल्पिक तर्क अनिवार्य तर्कों के पहले और बाद में दोनों आ सकते हैं।

मैं इस व्यवहार को कस्टम प्लॉट प्रकार के लिए दोहराना चाहता हूं ताकि यह अंतर्निहित साजिश कार्यों के समान शैली का अनुसरण कर सके। निम्नलिखित उपयोग-मामले प्रदर्शित करने के लिए है कि जाँच अकेले तर्क की संख्या अपर्याप्त है वांछित व्यवहार पूरा करने के लिए प्रस्तुत कर रहे हैं:

x = [1:10]; 
y = x.^2; 
ax(1) = subplot(1, 2, 1); 
ax(2) = subplot(1, 2, 2); 

myplot(x, y);     %Mandatory 
myplot(x, y, 'r+');   %Mandatory, optional 
myplot(ax(1), x, y);   %Optional, mandatory 
myplot(ax(2), x, y, 'r+'); %Optional, mandatory, optional 

मेरा प्रश्न है, क्या तकनीक हम इस व्यवहार का अनुकरण करने के लिए उपयोग कर सकते हैं?

उत्तर

4

आप एक ऐसा फ़ंक्शन लिख सकते हैं जो इनपुट के रूप में varargin लेता है। फिर, आप तर्कों की संख्या की जांच करते हैं। यदि यह 2 से कम है (या कुछ और, आपके फ़ंक्शन के आधार पर), एक त्रुटि या चेतावनी डालें। फिर, इनपुट पैरामीटर के class देखें।

यदि आपके पहले इनपुट का class'matlab.graphics.axis.Axes' है, तो आपके फ़ंक्शन को कॉल करना चाहिए: plot(ax,___)। यदि यह एक डबल है, तो यह प्रारूप plot(X,Y,LineSpec) होना चाहिए। इन पंक्तियों के साथ

कुछ काम करना चाहिए

function [] = myplot(varargin) 

if nargin < 2 
    error('Minimum two input must be given'); % You probably want something other than an error. This was just an example. 
elseif nargin == 2 
    % Code for plotting 
    plot(x, y) 
elseif nargin == 3 
    if strcmp(class(varargin{1}),'matlab.graphics.axis.Axes') 
     ax1 = varargin{1}; 
     x = varargin{2}; 
     y = varargin{3}; 
     plot(ax1, x, y) 
    elseif isa(varargin{2}, 'double') && isa(varargin{3}, 'double') && isa(varargin{3}, 'char') 
     x = varargin{1}; 
     y = varargin{2}; 
     LineSpec = varargin{3}; 
    else ... 

पुनश्च! आपको x = varargin{1} इत्यादि करने की आवश्यकता नहीं है, यह केवल यह स्पष्ट करने के लिए था कि iftrue का मूल्यांकन करता है, तो प्रत्येक सेल तत्वों में से प्रत्येक का प्रतिनिधित्व करता है।

आप "नाम-मूल्य जोड़े तर्क" जारी रख सकते हैं। जांचें कि इनपुट तर्क की कक्षा char है, और यह पैरामीटर नाम के अलावा किसी अन्य चीज़ का प्रतिनिधित्व नहीं कर सकती है। यदि यह पैरामीटर नाम है, तो आप जानते हैं कि अगला तर्क पैरामीटर मान है।

function varargout = myplot(obj, varargin) 

    % Check the number of output arguments. 
    nargoutchk(0,1); 

    % Parse possible axes input. 
    [ax, args, ~] = axescheck(varargin{:}); %#ok<ASGLU> 

    % Get handle to either the requested or a new axis. 
    if isempty(ax) 
     hax = gca; 
    else 
     hax = ax; 
    end 

    % At this point, hax refers either to a specified axis, or 
    % to a fresh one if none was specified. args refers to the 
    % remainder of any arguments passed in varargin. 

    % Parse the rest of args 

    % Make the plot in hax 

    % Output a handle to the axes if requested. 
    if nargout == 1 
     varargout{1} = hax; 
    end 

end 

axescheck एक गैर-दस्तावेजी कार्य है:

+0

मुझे एहसास हुआ कि यह ऐसा ही होगा जैसा कि यह किया गया है लेकिन उम्मीद कर रहा था कि कुछ और सुरुचिपूर्ण संभव था। – bhillam

+0

@ बिलीम मैं नहीं देखता कि इसके साथ क्या सुरुचिपूर्ण होगा? MATLAB फ़ंक्शन अधिभार की अनुमति नहीं देता है। इसके लिए आपको 2 कार्यों को वैसे भी लिखना होगा। – patrik

+0

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

7

मैं आमतौर पर इस तरह एक पैटर्न है, जो भी अंकन कार्यों कि MATLAB का हिस्सा हैं के कई द्वारा प्रयोग किया जाता है का उपयोग करें। आप हमेशा ऐसा करके एक छोटा सा जोखिम ले रहे हैं, लेकिन यह हमेशा के लिए MATLAB में मौजूद और अपरिवर्तित है, और इसका उपयोग MATLAB के भीतर कई बहुत ही साजिशपूर्ण कार्यों द्वारा किया जाता है, इसलिए आपको ठीक होना चाहिए।

यह जांचना है कि पहला तर्क धुरी के लिए एक हैंडल है या नहीं। यदि ऐसा है, तो ax हैडल है, और args शेष इनपुट तर्क है। यदि नहीं, तो ax खाली है और args में सभी इनपुट तर्क शामिल हैं।

आशा है कि मदद करता है!


संपादित करें: अनुरोध के अनुसार axescheck के बारे में अधिक जानकारी।

सबसे पहले, आप which axescheck और edit axescheck टाइप करके axescheck के लिए स्थान और स्रोत कोड देख सकते हैं। इस तरह आप देख सकते हैं कि यह वास्तव में क्या करता है।

वाक्यविन्यास [AX, ARGS, NARGS] = AXESCHECK(ARG1, ARG2, ...) है।

सबसे पहले, यह जांचता है कि ARG1 धुरी के लिए एक हैंडल है। यदि हां, तो यह, AX रूप में वापस आ रहा है शेष तर्कों (ARG2, ...) ARGS में लौट रहे हैं, और NARGSnargin शून्य से 1.

दूसरे का मान है, यह जाँच करता है, तो इनपुट तर्क से किसी के साथ एक पैरामीटर-मान युग्म है पैरामीटर Parent। यदि ऐसा है, तो पैरामीटर Parent पैरामीटर के साथ सभी पैरामीटर-मान जोड़े सूची से हटा दिए जाते हैं। निर्दिष्ट अक्ष AX में वापस आती है, शेष तर्क ARGS में लौटाए जाते हैं, और NARGSnargin का मूल्य हटाए गए तर्कों की संख्या से कम है।

कोई अक्ष ऊपर तरीकों में से किसी में निर्दिष्ट किया जाता है, तो AX खाली है, ARGS बस इनपुट तर्क है, और NARGSnargin का मूल्य है।

axescheck या तो पुरानी शैली (हैंडल ग्राफिक्स 1) डबल हैंडल, और नई शैली (हैंडल ग्राफिक्स 2) कक्षा matlab.graphics.axis.Axes के हैंडल के साथ काम करता है।

यह भी जांचता है कि आपूर्ति किए गए हैंडल एक हटाए गए ऑब्जेक्ट के लिए एक हैंडल है, अगर यह त्रुटि हो रही है।

यह कई अंतर्निहित MATLAB साजिश कार्यों के भीतर व्यापक रूप से उपयोग किया जाता है - उदाहरण के लिए, hist.m, polar.m, surfl.m, bar3.m, comet.m, pie.m और कई अन्य।

+0

यह उत्तर वादाजनक प्रतीत होता है लेकिन अनियंत्रित axescheck फ़ंक्शन पर अतिरिक्त जानकारी के साथ सुधार किया जा सकता है - कर्सर गूगलिंग ने कोई परिणाम नहीं बदला है। जैसे axescheck (varargin {:}) isa (varargin {1}, 'matlab.graphics.axis.Axes') से अलग कैसे है? – bhillam

+1

@bhillam 'axescheck' पर अधिक जानकारी के लिए मेरा संपादन देखें। –

+0

मुझे हमेशा एक जवाब चुनने में बुरा लगता है - काश मैं तुम्हारा फिर से उभारा सकता हूं। – bhillam

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