কীভাবে মার্জিকভাবে একটি ম্যাটল্যাব ফাংশনের কিছু রিটার্ন মান অগ্রাহ্য করবেন?


120

এর n-1আগে সমস্ত রিটার্ন মানগুলির জন্য ডামি ভেরিয়েবল তৈরি না করে কোনও ফাংশন থেকে 'নবম' রিটার্ন মান পাওয়া সম্ভব?

ধরা যাক, ম্যাটল্যাবে আমার নিম্নলিখিত ফাংশন রয়েছে:

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;

আমি এখনও মনে করি এটি খুব কুৎসিত কোড, তবে এর চেয়ে ভাল উপায় যদি না থাকে তবে আমার ধারণা আমি উত্তরটি গ্রহণ করব।


আমার উত্তরে যেমন বর্ণনা করা হয়েছে তেমন একটি সেল অ্যারে ব্যবহার করা বাদ দিয়ে, চলক নামটি পুনরাবৃত্তি করা সম্ভবত আপনার একমাত্র অন্য সমাধান। আশাকরি আপনার পরিবর্তনশীল নামগুলি "ভেরিয়েবলতলা উইলিউজ" হিসাবে দীর্ঘ নয়। =)
জিনোভিস

আসলে তারা হয়। 'ডামি' কেবল একটি উদাহরণ ছিল। সাধারণত আমি 'পরিবর্তনশীলThatIWillNotUse' ব্যবহার করব। অন্যান্য ভেরিয়েবলের নাম দেওয়া হয়েছে 'ভেরিয়েবলটিটাইমাইটউজ', 'ভ্যারিয়েবলত্যাচিটুইউইলউস 2' এবং 'ভেরিয়েবলত্যাচিটক্যানবারেইফিটঅনএএএন 80CharacterLine'। আমি দীর্ঘ নাম এবং হত্যাকান্ডের রেটিংয়ের মধ্যে পারস্পরিক সম্পর্ক নিয়ে গবেষণা করছি। ;)
জর্দি

26
আসলে যেহেতু R2009b ফাংশন রিটার্ন উপেক্ষা করে আরও বেশি সুন্দরভাবে 'har' -Char ব্যবহার করে সমাধান করা হয়। উদাহরণস্বরূপ: [~, খ] = সাজান (র‌্যান্ড (10,1))

1
নতুন পাঠকদের জন্য: ^ এর সঠিক উত্তর হওয়া উচিত। দেখুন ManWithSleeve এর উত্তর নিচে
A.Wan

1
উদাহরণস্বরূপ, আপনি যদি কেবল তৃতীয় আউটপুট আর্গুমেন্ট চান তবে আপনি ব্যবহার করতে পারেন: [ভেরিয়েবলট্যাটিওয়িলিউজ, ভ্যারিয়েবলট্যাটিওয়িলইউস, ভেরিয়েবলThatIWillUse] = ফানক; একটি ডামি ভেরিয়েবল সাফ করার দরকার নেই। নতুন ম্যাটল্যাব সংস্করণগুলিতে> = আর ২০০৯ বি এর জন্য, [~, ~, ভেরিয়েবলট্যাটআইওয়িলইউস] = ফানক ব্যবহার করুন;
থিয়েরি ডালন

উত্তর:


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তৃতীয় যুক্তি থেকে থাকে তবে )


সম্পাদনা: আরও ভাল পদ্ধতির আছে; পরিবর্তে ম্যানুইথস্লিভের উত্তর দেখুন ।


7
এভাবে সমাধান করার কথা ভাবেননি। তবে, আমি মনে করি যে এই সমাধানটি চতুরতার জন্য অভিপ্রায়ের স্পষ্টতাকে ত্যাগ করে।
জুলকা দহলবম

5
আমি ব্যক্তিগতভাবে কেবল [জাঙ্ক, জাঙ্ক, সি] = ফাংশন_ক্যাল () ব্যবহার করি এবং উভয়ই ধরে নিয়েছি যে "জাঙ্ক" কখনই একটি গুরুত্বপূর্ণ পরিবর্তনশীল নয় এবং যদি এতে প্রচুর স্মৃতি থাকে যা আমি প্রয়োজনে এটি সাফ করব।
জেসন এস

5
অবনতকারীকে: কেন -1? এই উত্তরটি আর -2009 বি প্রকাশের আগেই লেখা হয়েছিল, সুতরাং @ ম্যান উইথস্লিভের উত্তরটি সেই সময়ে কাজ করতে পারত না। এখন, অবশ্যই এটি সঠিক পদ্ধতির।
জেসন এস

2
আপনার উত্তরের প্রথম লাইনে একটি মন্তব্য সহায়ক হতে পারে? আমি স্রেফ গুগলের মাধ্যমে এখানে এসেছি, সুতরাং এটি আপডেট করার মতো বলে মনে হচ্ছে।
এফভিডি

বাম থেকে ডান অ্যাসাইনমেন্টটি আনুষ্ঠানিকভাবে ম্যাথ ওয়ার্কস দ্বারা গ্যারান্টিযুক্ত নয়, সুতরাং আপনার সম্ভবত সি [সি, সি, সি] = মাইফঙ্ক () এর পরে সি ব্যবহারের উপর নির্ভর করা উচিত নয়। (মন্তব্য # 26 এখানে দেখুন: ব্লগস.ম্যাথওয়ার্কস / ফ্লোর / 2009 / 09 / 11/… )
ম্যাট ক্রাউস

226

ম্যাটল্যাব সংস্করণ 7.9 (R2009b) দিয়ে আপনি একটি ~ ব্যবহার করতে পারেন, উদাহরণস্বরূপ,

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

নোট করুন the ,চ্ছিক নয়। কেবল টাইপিং [~ ~ var]কাজ করবে না এবং ত্রুটি ছুঁড়ে দেবে।

বিশদ জন্য রিলিজ নোট দেখুন ।


3
ধরণের বিরক্তিজনক যে এটি "_" নয়। (আমি মনে করি এটি ইতিমধ্যে নেওয়া হয়েছিল?)
স্যামবি

4
@ সাম্ব: যদিও notঅপারেটরটি হিসাবে ব্যবহার করা don't careখারাপ হয় না
টোবিয়াস কেইনজলার

28
মনে রাখবেন যে এটি ,alচ্ছিক নয়। কেবল টাইপিং কাজ [~ ~ var]করবে না এবং ত্রুটি ছুঁড়ে দেবে।
eykanal

আমি বলব যে এটি "সঠিক" উত্তর। অন্যটি অস্তিত্বহীন এমন একটি সমস্যা ঠিক করার জন্য কেবল হ্যাক। যদিও কোনও পাং এর উদ্দেশ্য নেই ...
দেশপ্রেমিক

6
প্রশ্নটি ২০০৯ সালে আর ২০০৯ বি এর আগে উত্থাপিত হয়েছিল, সেই সময়ে work কাজ করেনি।
টম অ্যান্ডারসন

37

আপনি যদি এমন কোনও শৈলী ব্যবহার করতে চান যেখানে একটি পরিবর্তনশীল বিট বালতির মধ্যে পড়ে যায় তবে যুক্তিসঙ্গত বিকল্পটি

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

উত্তর অবশ্যই ম্যাট্লাবের জন্য ডিফল্ট জাঙ্ক ভেরিয়েবল, একটি সেশনের সময় প্রায়শই ওভাররাইট হয়ে যায়।

আমি ম্যাটল্যাব এখন যে নতুন ট্রিকটিকে মঞ্জুরি দিয়েছি তা করতে চাইলেও একটি উপেক্ষিত রিটার্ন ভেরিয়েবল নির্ধারণ করতে ~ ব্যবহার করে এটি পিছনের সামঞ্জস্যের জন্য একটি সমস্যা, এতে পুরানো প্রকাশের ব্যবহারকারীরা আপনার কোড ব্যবহার করতে অক্ষম হবে। খুব সহজেই খুব কম ব্যবহারকারী বাকী থাকতে হবে তা নিশ্চিত করার জন্য আমি সাধারণত এ জাতীয় নতুন জিনিস ব্যবহার করা এড়িয়ে চলি যতক্ষণ না কমপক্ষে কয়েকটি ম্যাটল্যাব প্রকাশ প্রকাশ করা হয়। উদাহরণস্বরূপ, এখনও আমি দেখতে পাচ্ছি যে লোকেরা এখনও একটি পুরানো যথেষ্ট ম্যাটল্যাব রিলিজ ব্যবহার করছে যা তারা বেনামী ফাংশন ব্যবহার করতে পারে না।


7
হ্যাঁ, এটি চতুর, তবে আপনি যদি উত্তর ভেরিয়েবলকে কিছু বরাদ্দ করেন তবে নেটিভ মতলব সম্পাদক একটি সতর্কতা দেবেন। আমি সতর্কতাগুলি খুব মার্জিত বলে মনে করি না ...
জর্ডি

11
আপনি সতর্কতাটি বন্ধ করতে পারেন। % # ঠিক আছে এই মন্তব্যের স্ট্রিং দিয়ে লাইনটি শেষ করুন এটির পরে এটিকে উপেক্ষা করা হবে। কোন সতর্কতা।

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 এ, আপনি যা চাইছেন তা করার একটি ঝরঝরে উপায় পেয়েছি। আপনার ডামি ভেরিয়েবল হিসাবে ("একাধিক পরামিতি ফেরার সময় আপনি যতগুলি চান) হিসাবে" ~ "(অবশ্যই কোটগুলি ছাড়াই) চরিত্রটি ব্যবহার করা সহজ is এটি ফাংশনগুলিতে ইনপুট পরামিতিগুলির জন্যও কাজ করে যদি ফাংশনগুলি অনুপস্থিত ডেটা হ্যান্ডেল করার জন্য তৈরি করা হয়। এটি পূর্ববর্তী সংস্করণগুলিতে বিদ্যমান ছিল কিনা তা আমি জানি না, তবে আমি সম্প্রতি এটি পেরিয়ে এসেছি।


11
আপনি কি আগের উত্তরটি দেখেন নি?
yuk

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);
নটগেইল

1
select(func,2)কল func(2)। আমি দেখতে পাচ্ছি না যেখানে এটি আউটপুট আর্গুমেন্ট নির্বাচন করে।
ক্রিস লুয়েংগো

0

এর মতো উত্তরগুলি (এন) ব্যবহার না করার কোনও কারণ আছে:

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

size(a);

b=ans(2);

খ = 10 দেয় এবং এইভাবে সমস্ত মতলব সংস্করণের সাথে সামঞ্জস্য হবে না?

তদ্ব্যতীত, এটি দ্বিতীয় আউটপুট আর্গুমেন্টটি পাওয়ার জন্য কাজ করে যখন আপনি জানেন না যে সেখানে কতগুলি আর্গুমেন্ট থাকবে! আপনি যদি এটি করেন তবে:

[~, b] = size(a);

তারপরে খ = 8000! (আরও যুক্তি ধরার জন্য আপনাকে with দিয়ে শেষ করতে হবে!)


এই উত্তরটি ভেরিয়েবলটি ফিরিয়ে দেওয়া ভেক্টর হিসাবে ধরে নিয়েছে, যা সম্ভবত ওপি বলতে বোঝায়নি।
নীল ট্রাফট

এর কোন মানে নেই. size(a)এবং [b,c]=size(a)বিভিন্ন জিনিস ফিরে। আউটপুট আর্গুমেন্টের সংখ্যার উপর ভিত্তি করে ম্যাটল্যাবের কার্যগুলি আচরণ পরিবর্তন করে।
ক্রিস লুয়েংগো

এই উত্তরটি বুঝতে আমার খুব কষ্ট হচ্ছে। আমি জানি না যে এটি এখানে উত্তরগুলির মানের ক্ষেত্রে কীভাবে অবদান রাখে, একা ছেড়ে দিন যে এটি সরাসরি মূল প্রশ্নের উত্তর দেয় না।
রায়রেং

এটি 6 বছর পরে, এবং আমি আর মাতলাব ব্যবহার করি না। যতদূর আমি মনে করি, "আকার ()" ফাংশনটি অপ্রাসঙ্গিক - আমি কেবল এটি একটি ফাংশন হিসাবে ব্যবহার করেছি যা একাধিক যুক্তি ফিরিয়ে দেবে। মুল বক্তব্যটি হ'ল আমি সহজেই ফানক () কল করতে পারি এবং তারপরে উত্তর (এন) ফেরত চলক সংখ্যার মান পেতে n। এটি নির্দিষ্ট পরিস্থিতির জন্য ভালভাবে কাজ করেছে এবং পিছনের দিকে সামঞ্জস্যপূর্ণ হবে বলে মনে হয়েছে। এটি কেবল অবশ্যই কিছু নির্দিষ্ট ফাংশন বা পরিবর্তনশীল প্রকারের সাথে কাজ করতে পারে, যাই হোক না কেন। এটি আমি 6 বছর পরে যতটা সাহায্য করতে পারি
ব্যবহারকারী 1596274
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.