MATLAB फ़ंक्शन के कुछ रिटर्न मानों को आसानी से कैसे अनदेखा करें?


120

क्या n-1इससे पहले सभी रिटर्न वैल्यू के लिए डमी वैरिएबल बनाए बिना किसी फ़ंक्शन से 'एनटीएच' रिटर्न वैल्यू प्राप्त करना संभव है?

मान लीजिए, मेरे पास MATLAB में निम्नलिखित कार्य हैं:

function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;

अब मान लीजिए, मुझे केवल तीसरे रिटर्न मान में दिलचस्पी है । यह एक डमी चर बनाकर पूरा किया जा सकता है:

[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;

लेकिन मुझे लगता है कि यह बदसूरत है । मुझे लगता है कि आप निम्नलिखित चीजों में से एक की तरह कुछ करने में सक्षम हो सकते हैं, लेकिन आप नहीं कर सकते:

[_, _, variableThatIWillUse, _] = func;

[, , variableThatIWillUse, ] = func;

variableThatIWillUse = func(3);

variableThatIWillUse = func()(3);

क्या ऐसा करने के लिए कोई सुरुचिपूर्ण तरीके हैं जो काम करते हैं?


अब तक, सबसे अच्छा समाधान केवल variableThatIWillUseडमी चर के रूप में उपयोग करना है । यह मुझे एक वास्तविक डमी वैरिएबल बनाने से बचाता है जो कार्य-स्थान को प्रदूषित करता है (या जिसे मुझे स्पष्ट करने की आवश्यकता होगी)। संक्षेप में: समाधान variableThatIWillUseप्रत्येक वापसी मूल्य के लिए दिलचस्प एक होने तक उपयोग करना है । मूल्यों को अनदेखा करने के बाद वापस किया जा सकता है:

[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;

मुझे अभी भी लगता है कि यह बहुत बदसूरत कोड है, लेकिन अगर कोई बेहतर तरीका नहीं है, तो मुझे लगता है कि मैं जवाब स्वीकार कर लूंगा।


सेल सरणी का उपयोग करने के अलावा, जैसा कि मैंने अपने उत्तर में बताया है, चर नाम को दोहराना शायद आपका एकमात्र समाधान है। उम्मीद है कि आपके वैरिएबल के नाम तब तक नहीं होंगे जब तक कि "वेरिएंटहैटविल्स" नहीं होगा। =)
gnovice

वास्तव में वे हैं। 'डमी' केवल एक उदाहरण था। आम तौर पर मैं 'variableThatIWillNotUse' का उपयोग करता हूँ। अन्य चरों का नाम 'वैरिएंटहाइमटाइसे', 'वैरिएंटहिलविलेसी 2' और 'वैरैटचैटनबेयरलीफिटऑनएऑलचैटरलाइन' है। मैं लंबे नामों और हत्या की रेटिंग के बीच संबंध पर शोध कर रहा हूं। ;)
जोर्डी

26
वास्तव में चूंकि R2009b फंक्शन रिटर्न को नजरअंदाज करते हुए '~' -चर्चा का उपयोग करते हुए अधिक सुरुचिपूर्ण ढंग से हल किया जाता है। उदाहरण: [~, b] = सॉर्ट (रैंड (10,1))
ymihere

1
नए पाठकों के लिए: ^ सही उत्तर होना चाहिए। देखें ManWithSleeve का जवाब नीचे
A.Wan

1
आप उदाहरण में, यदि आप केवल 3 डी आउटपुट तर्क चाहते हैं, जिसका आप उपयोग करेंगे: [variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func; एक डमी चर को खाली करने की आवश्यकता नहीं है। नए MATLAB संस्करणों के लिए> = R2009b, [~, ~, variableThatIWillUse] = func का उपयोग करें;
थियरी डेलन

जवाबों:


38

यह कुछ हद तक एक हैक है लेकिन यह काम करता है:

पहला त्वरित उदाहरण फ़ंक्शन:

Func3 = @() deal(1,2,3);
[a,b,c]=Func3();
% yields a=1, b=2, c=3

अब यहां कुंजी यह है कि यदि आप एक बहु-अभिव्यक्ति असाइनमेंट के बाएं हाथ में दो बार एक चर का उपयोग करते हैं , तो पहले के असाइनमेंट को बाद के असाइनमेंट द्वारा क्लोब किया गया है:

[b,b,c]=Func3();
% yields b=2, c=3

[c,c,c]=Func3();
% yields c=3

(संपादित करें: बस जांच करने के लिए, मैंने यह भी सत्यापित किया कि यह तकनीक काम करती है [mu,mu,mu]=polyfit(x,y,n)यदि आप सभी से ध्यान रखते हैं polyfitकि तीसरा तर्क क्या है)


संपादित करें: एक बेहतर तरीका है; इसके बजाय ManWithSleeve का जवाब देखें ।


7
इसे इस तरह हल करने के बारे में नहीं सोचा था। हालांकि, मुझे लगता है कि यह समाधान चतुराई के इरादे की स्पष्टता का त्याग करता है।
जुका डाहलबॉम

5
मैं व्यक्तिगत रूप से सिर्फ [कबाड़, कबाड़, ग] = function_call () का उपयोग करता हूं और दोनों को लगता है कि "जंक" कभी भी एक महत्वपूर्ण चर नहीं है और यदि इसमें बहुत अधिक मेमोरी है तो मैं इसे आवश्यक होने पर साफ कर दूंगा।
जेसन एस

5
downvoter के लिए: क्यों -1? यह उत्तर R2009b के जारी होने से पहले ही लिखा गया था, इसलिए @ ManWithSleeve के उत्तर ने उस समय काम नहीं किया होगा। अब, निश्चित रूप से, यह सही तरीका है।
जेसन एस

2
हो सकता है कि आपके उत्तर की पहली पंक्ति में कोई टिप्पणी सहायक हो? मैं अभी Google के माध्यम से यहां आया हूं, इसलिए ऐसा लगता है कि यह अपडेट करने लायक है।
FvD

बाएं से दाएं असाइनमेंट की आधिकारिक तौर पर MathWorks द्वारा गारंटी नहीं दी गई है, इसलिए आपको संभवतः [c, c, c] = myFunc () के बाद c का उपयोग करने पर भरोसा नहीं करना चाहिए। (टिप्पणी # 26 यहां देखें: blogs.mathworks.com/loren/2009/09/11/… )
मैट

226

MATLAB संस्करण 7.9 (R2009b) के साथ आप एक ~, उदाहरण के लिए, का उपयोग कर सकते हैं

[~, ~, variableThatIWillUse] = myFunction();

ध्यान दें कि ,वैकल्पिक नहीं है। सिर्फ टाइप करने [~ ~ var]से काम नहीं चलेगा, और एक त्रुटि होगी।

देखें रिलीज नोट्स जानकारी के लिए।


3
यह "_" नहीं है कि कष्टप्रद है। (मुझे लगता है कि पहले से ही लिया गया था?)
SamB

4
@SBB: यद्यपि notऑपरेटर का उपयोग करना उतना don't careबुरा नहीं है
टोबैस किंजलर

28
ध्यान दें कि ,वैकल्पिक नहीं है। सिर्फ टाइप करने [~ ~ var]से काम नहीं चलेगा , और एक त्रुटि होगी।
पलक

मैं कहूंगा कि यह "सही" उत्तर है। दूसरी समस्या को हल करने के लिए सिर्फ हैक हैं जो मौजूद नहीं हैं। हालांकि कोई
सज़ा

6
2009 में R2009b से पहले प्रश्न पूछा गया था, उस समय ~ काम नहीं किया था।
टॉम एंडरसन

37

यदि आप एक ऐसी शैली का उपयोग करना चाहते हैं जहां एक चर बिट बाल्टी में गिरने के लिए छोड़ दिया जाएगा, तो एक उचित विकल्प है

[ans,ans,variableThatIWillUse] = myfun(inputs);

ans बेशक मैटलैब के लिए डिफ़ॉल्ट जंक वैरिएबल है, जो सत्र के दौरान अक्सर ओवरराइट हो जाता है।

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


7
हाँ, यह चतुर है, लेकिन अगर आप किसी भी चर को असाइन करते हैं तो देशी मैटलैब संपादक चेतावनी देगा। मुझे नहीं लगता कि चेतावनियाँ बहुत खूबसूरत होती हैं ...
जोर्डी

11
आप चेतावनी को बंद कर सकते हैं। इस टिप्पणी के साथ लाइन समाप्त करें स्ट्रिंग% # ठीक Mlint इसके बाद इसे अनदेखा करेगा। कोई चेतावनी नहीं।

13

यहां एक और विकल्प है जिसका आप उपयोग कर सकते हैं। पहले सभी आउटपुट कैप्चर करने के लिए एक सेल ऐरे बनाएं ( दिए गए फंक्शन रिटर्न कितने आउटपुट को निर्धारित करने के लिए आप NARGOUT फ़ंक्शन का उपयोग कर सकते हैं ):

a = cell(1,3);  % For capturing 3 outputs
% OR...
a = cell(1,nargout(@func));  % For capturing all outputs from "func"

फिर फ़ंक्शन को निम्नानुसार कॉल करें:

[a{:}] = func();

तब बस से तत्व निकाल एक है कि आप चाहते हैं, और ऊपर लिख एक :

a = a{3};  % Get the third output

9

मैंने एक kth आउट फंक्शन लिखा:


function kth = kthout(k,ffnc,varargin)
%% kthout: take the kth varargout from a func call %FOLDUP
% 
% kth = kthout(k,ffnc,varargin)
%
% input:
%  k                      which varargout to get
%  ffnc                   function to call;
%  varargin               passed to ffnc;
% output:
%  kth                    the kth argout;
% global:
% nb: 
% See also:
% todo:
% changelog: 
%
%% %UNFOLD

[outargs{1:k}]  = feval(ffnc,varargin{:});
kth                         = outargs{k};

end %function

फिर आप कॉल कर सकते हैं

val_i_want  = kthout(3,@myfunc,func_input_1,func_input_2); %etc

तुम भी समारोह की तरह लपेट सकता है

func_i_want = @(varargin)(kthout(3,@myfunc,varargin{:}));  %assuming you want the 3rd output.

जिसके बाद आप उपयोग करते हैं

val_i_want = func_i_want(func_input_1,func_input_2);

ध्यान दें कि इस तरह अनाम कार्यों का उपयोग करने के साथ जुड़ा हुआ ओवरहेड है, और यह ऐसा कुछ नहीं है जो मैं कोड में करूँगा जो हजारों बार कहा जाएगा।


4

मतलाब 2010 ए में, मुझे आपके द्वारा पूछे जा रहे काम करने का एक अच्छा तरीका मिला। यह बस अपने डमी चर के रूप में "~" (पाठ्यक्रम के उद्धरण के बिना) का उपयोग करने के लिए बस है (कई मापदंडों को वापस करते समय आप जितना चाहते हैं)। यह फ़ंक्शंस के इनपुट इनपुट के लिए भी कार्य करता है यदि फ़ंक्शन लापता डेटा को संभालने के लिए डिज़ाइन किया गया हो। मुझे नहीं पता कि यह पिछले संस्करणों में मौजूद था, लेकिन मैं अभी हाल ही में आया था।


11
क्या आपने पिछला उत्तर नहीं देखा?
युक

1

आप एक फ़ंक्शन (या अनाम फ़ंक्शन) बना सकते हैं जो केवल चयनित आउटपुट देता है, जैसे

select = @(a,b) a(b);

तब आप अपने फ़ंक्शन को इस तरह से कॉल कर सकते हैं:

select(func,2);
select(func,1:3);

या आप एक चर के लिए उत्पादन असाइन कर सकते हैं:

output(1,2:4) = select(func,1:3);

मेरे लिए काम नहीं करता। कोशिश कीdecimatedfftx = select(fft(x,12),1:4:12);
NotGaeL

1
select(func,2)कॉल करता है func(2)। मैं यह नहीं देखता कि यह आउटपुट तर्कों का चयन कहाँ करता है।
संकट लुएंगो

0

क्या इस तरह से एन (एन) का उपयोग करने का कोई कारण नहीं है:

a=rand([5 10 20 40]);

size(a);

b=ans(2);

B = 10 देता है, और क्या यह तरीका सभी Matlab संस्करणों के साथ संगत नहीं होगा?

इसके अलावा, यह दूसरा आउटपुट तर्क प्राप्त करने के लिए काम करता है जब आप नहीं जानते कि वहाँ कितने तर्क होंगे! जबकि, यदि आप ऐसा करते हैं:

[~, b] = size(a);

फिर b = 8000! (आपको अधिक तर्क पकड़ने के लिए ~ के साथ समाप्त होने की आवश्यकता है!)


यह उत्तर मानता है कि लौटाया जा रहा चर एक सदिश राशि है, जो संभवतः ओपी का मतलब नहीं था।
नील ट्राफ

इसका कोई अर्थ नहीं निकलता। size(a)और [b,c]=size(a)अलग-अलग चीजें लौटाते हैं। MATLAB में फ़ंक्शंस आउटपुट तर्कों की संख्या के आधार पर व्यवहार को बदलते हैं।
संकट लुआंगो

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

यह 6 साल बाद है, और मैं अब मतलाब का उपयोग नहीं करता हूं। जहां तक ​​मुझे याद है, फ़ंक्शन "आकार ()" अप्रासंगिक था - मैंने इसे केवल एक फ़ंक्शन के रूप में उपयोग किया था जो कई तर्क लौटाएगा। मुद्दा यह है कि मैं केवल दिए गए चर संख्या n का मान प्राप्त करने के लिए func () और फिर ans (n) कह सकता हूं। यह कुछ स्थितियों के लिए अच्छा काम करता है और पीछे की ओर संगत है। यह केवल पाठ्यक्रम के कुछ कार्यों या चर प्रकारों के साथ काम कर सकता है, जो भी हो। यह उतना ही है जितना मैं 6 साल बाद मदद कर सकता हूं।
user1596274
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.