ম্যাটল্যাবে প্রতি ফাইলের জন্য একাধিক ফাংশন সংজ্ঞায়িত করা এবং সেগুলি ফাইলের বাইরে থেকে অ্যাক্সেস করা সম্ভব?


217

আমি যখন ইইতে আমার স্নাতক ডিগ্রির জন্য অধ্যয়নরত ছিলাম, তখন ম্যাটল্যাব প্রতিটি ফাংশনকে তার নিজের ফাইলে সংজ্ঞায়িত করা প্রয়োজন, এমনকি এটি যদি ওয়ান-লাইনার ছিল।

আমি এখন স্নাতক ডিগ্রির জন্য অধ্যয়ন করছি, এবং আমাকে ম্যাটল্যাবে একটি প্রকল্প লিখতে হবে। এটি কি এখনও ম্যাটল্যাবের নতুন সংস্করণগুলির জন্য প্রয়োজনীয়?

যদি কোনও ফাইলে একাধিক ফাংশন স্থাপন করা সম্ভব হয় তবে এতে কি কোনও বিধিনিষেধ রয়েছে? উদাহরণস্বরূপ, ফাইলের সমস্ত ফাংশনগুলি কি ফাইলের বাইরে থেকে অ্যাক্সেস করা যায়, বা কেবল সেই ফাংশনটিতে যা ফাইলটির একই নাম রয়েছে?

দ্রষ্টব্য: আমি MATLAB রিলিজ R2007b ব্যবহার করছি।

উত্তর:


271

কোনও এম-ফাইলের প্রথম ফাংশন (অর্থাত্ মূল ফাংশন ), যখন সেই এম-ফাইলটি কল করা হয়। মূল ফাংশনের এম-ফাইলের মতো একই নাম থাকা প্রয়োজন নয় , তবে স্পষ্টতার জন্য এটি হওয়া উচিত । যখন ফাংশন এবং ফাইলের নাম পৃথক হয়, তখন ফাইলের নামটি মূল ফাংশনটি কল করতে অবশ্যই ব্যবহার করা উচিত।

এম-ফাইলে পরবর্তী সমস্ত ফাংশন, স্থানীয় ফাংশন (বা "পুরানো পরিভাষায়" সাবফিউশনস) বলা হয়, কেবল সেই এম-ফাইলের মূল ফাংশন এবং অন্যান্য স্থানীয় ফাংশন দ্বারা কল করা যেতে পারে। অন্যান্য এম-ফাইলে ফাংশনগুলি তাদের কল করতে পারে না। আর -2016 বি থেকে শুরু করে, আপনি স্ক্রিপ্টগুলিতে স্থানীয় ফাংশনগুলিও যুক্ত করতে পারেন , যদিও স্কোপিং আচরণটি একই রকম (যেমন এগুলি কেবল স্ক্রিপ্টের মধ্যে থেকে কল করা যেতে পারে)।

এছাড়াও, আপনি অন্যান্য ফাংশনগুলির মধ্যে ফাংশনও ঘোষণা করতে পারেন । এগুলিকে নেস্টেড ফাংশন বলা হয় এবং এগুলি কেবল নেস্ট করা ফাংশন থেকেই কল করা যায়। তারা যে কাজগুলিতে বাসা বাঁধে সেগুলিতেও ভেরিয়েবলের অ্যাক্সেস থাকতে পারে, যা তাদের সাথে কাজ করার জন্য কিছুটা জটিল হলেও বেশ কার্যকর করে তোলে।

চিন্তার জন্য আরও খাবার ...

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

উদাহরণস্বরূপ, ধরুন, আপনি একটি প্রধান ফাংশন আছে যাক Aএকটি M-ফাইলের মধ্যে A.m, স্থানীয় ফাংশন সঙ্গে বরাবর D, Eএবং F। এখন ধরুন আপনি দুই অন্যান্য সম্পর্কিত ফাংশন দাও Bএবং CM-ফাইলের মধ্যে B.mএবং C.mযথাক্রমে, তোমরাও তেমনি কল করতে পারবেন হতে চান D, Eএবং F। আপনার কাছে কয়েকটি বিকল্প এখানে রয়েছে:

  • রাখুন D, Eএবং Fপ্রতিটি তাদের নিজস্ব পৃথক এম-ফাইলগুলিতে রাখুন , অন্য কোনও ফাংশন তাদের কল করার অনুমতি দেয়। Downside হয় যে এই ফাংশন পরিধি বড় এবং মাত্র অবধি সীমিত নয় A, Bএবং C, কিন্তু গোলমালে যে এই বেশ সহজ হয়।

  • একটি তৈরি করুন defineMyFunctionsসঙ্গে (জোনাস 'উদাহরণে মত) M-ফাইল D, Eএবং Fস্থানীয় কার্যকারিতা ও একটি প্রধান ফাংশন হিসাবে যে কেবল আয় তাদের হ্যান্ডলগুলি কাজ করে। এই আপনি রাখার অনুমতি দেয় D, Eএবং, Fএকই ফাইলের মধ্যে, কিন্তু এটা কোন ফাংশন যা কল করতে পারেন যেহেতু এই ফাংশন পরিধি সংক্রান্ত কিছু না defineMyFunctionsতাদের ডাকা পারবেন না। তারপরে আপনার নিজের যেখানে প্রয়োজন সেখানে আপনার রয়েছে তা নিশ্চিত করার জন্য আপনাকে চার্জটি হস্তান্তর করার বিষয়ে চারপাশে তর্ক করতে হবে।

  • কপি D, Eএবং Fমধ্যে B.mএবং C.mস্থানীয় ফাংশন হিসাবে। এটি তাদের ব্যবহারের সুযোগ কেবল A, Bএবং C, এ সীমাবদ্ধ করে তবে আপনার কোডটির আপডেটিং এবং রক্ষণাবেক্ষণকে একটি দুঃস্বপ্ন করে তোলে কারণ আপনার কাছে একই জায়গায় তিনটি অনুলিপি একই জায়গায় রয়েছে।

  • ব্যক্তিগত ফাংশন ব্যবহার করুন ! আপনি যদি A, Bএবং Cএকই ডিরেক্টরির মধ্যে, আপনি একটি সাব নামক তৈরি করতে পারেন privateএবং স্থান D, Eএবং Fসেখানে একটি পৃথক M-ফাইল হিসাবে প্রতিটি। এটি তাদের সুযোগ সীমিত তাই তারা শুধুমাত্র অবিলম্বে উপরে ডিরেক্টরির মধ্যে ফাংশন দ্বারা বলা যেতে পারে (অর্থাত A, Bএবং C) এবং তাদের একই স্থানে একসঙ্গে রাখে (কিন্তু এখনও বিভিন্ন M-ফাইল):

    myDirectory/
        A.m
        B.m
        C.m
        private/
            D.m
            E.m
            F.m

এটি আপনার প্রশ্নের ক্ষেত্রের বাইরে কিছুটা বাইরে চলে গেছে এবং সম্ভবত আপনার প্রয়োজনের তুলনায় এটি আরও বিশদ, তবে আমি ভেবেছিলাম আপনার সমস্ত এম-ফাইলগুলি সংগঠিত করার আরও সাধারণ উদ্বেগের দিকে স্পর্শ করা ভাল। ;)


3
প্রিয় উত্তর বিকল্পটি এর মতো দেখাচ্ছে ^, @idigas
এমবার্ট

1
@ অ্যাম্বার্ট আমি ধরে নিয়েছি যে তিনি একটি প্রশ্নকে উত্সাহ দেওয়ার ধরণ ধরেই বোঝাতে চেয়েছিলেন, যার পক্ষে স্বতন্ত্রভাবে ভোট গ্রহণের পক্ষে স্বাধীনভাবে ভোট দেওয়া যেতে পারে।
ওজেফোর্ড

79

সাধারণত, আপনার প্রশ্নের উত্তর হ'ল না, আপনি প্রতি ফাইলটিতে একাধিক বাহ্যিক দৃশ্যমান ফাংশন সংজ্ঞায়িত করতে পারবেন না। আপনি স্থানীয় ফাংশনগুলিতে ফাংশন হ্যান্ডলগুলি ফিরিয়ে দিতে পারেন, যদিও এটি করার একটি সুবিধাজনক উপায় হ'ল তাদের কাঠামোর ক্ষেত্র তৈরি করা। এখানে একটি উদাহরণ:

function funs = makefuns
  funs.fun1=@fun1;
  funs.fun2=@fun2;
end

function y=fun1(x)
  y=x;
end

function z=fun2
  z=1;
end

এবং এটি এখানে কীভাবে ব্যবহার করা যায় তা এখানে:

>> myfuns = makefuns;
>> myfuns.fun1(5)    
ans =
     5
>> myfuns.fun2()     
ans =
     1

36

একক ফাইলে একাধিক, পৃথকভাবে অ্যাক্সেসযোগ্য ফাংশন থাকার একমাত্র উপায় হ'ল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ব্যবহার করে স্ট্যাটিক মেথডগুলি সংজ্ঞায়িত করা । আপনি যত ফাংশন অ্যাক্সেস চাই ,myClass.static1()myClass.static2() ইত্যাদি

ওওপি কার্যকারিতা কেবল আনুষ্ঠানিকভাবে আর -2008 এ সমর্থিত, সুতরাং আপনি যদি পুরানো, অনির্ধারিত ওওপি সিনট্যাক্সটি ব্যবহার না করতে চান তবে আপনার উত্তরটি নেই, @gnovice দ্বারা ব্যাখ্যা করা হিসাবে

সম্পাদনা

বাইরে থেকে অ্যাক্সেসযোগ্য কোনও ফাইলের মধ্যে একাধিক ফাংশন সংজ্ঞায়িত করার আরও একটি উপায় হ'ল একাধিক ফাংশন হ্যান্ডলগুলি ফেরত দেয় এমন একটি ফাংশন তৈরি করা । অন্য কথায়, আপনি আপনার সংজ্ঞায়িত ফাংশনটিকে কল করবেন [fun1,fun2,fun3]=defineMyFunctionsযার পরে আপনি out1=fun1(inputs)ইত্যাদি ব্যবহার করতে পারবেন etc.


আমি এই উদ্দেশ্যে উফ ব্যবহার করব না, এটি বিশেষত স্থির পদ্ধতির জন্য যথেষ্ট ওভারহেড যুক্ত করে। ( স্ট্যাকওভারফ্লো.com / জিজ্ঞাসা / 1693429/… )
ড্যানিয়েল

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

23

আমি সত্যিই এসসিফ্রঞ্চের উত্তরটি পছন্দ করি - আমি উল্লেখ করতে চাই যে এ্যাসাইন ফাংশনটি ব্যবহার করে সরাসরি ওয়ার্কস্পেসে ফাংশনগুলি আমদানি করার জন্য এটি সহজেই পরিবর্তন করা যেতে পারে । (এটি এরকম করে করা আমাকে পাইথনের অনেকগুলি "আমদানি x থেকে y" কাজ করার পদ্ধতি মনে করিয়ে দেয়)

function message = makefuns
  assignin('base','fun1',@fun1);
  assignin('base','fun2',@fun2);
  message='Done importing functions to workspace';
end

function y=fun1(x)
  y=x;
end

function z=fun2
  z=1;
end

এবং তারপরে এভাবে ব্যবহার করা হয়:

>> makefuns
ans =
Done importing functions to workspace

>> fun1(123)
ans =
   123

>> fun2()
ans =
     1

assignin('caller',...)আরও সঠিক হবে। আপনি অন্য ফাংশন থেকে এই ফাংশন ব্যবহার করতে চাইতে পারেন।
ক্রিস লুয়েংগো

10

এসসিফ্রঞ্চের উত্তর হিসাবে একই লাইন বরাবর, তবে আরও সি ​​# স্টাইল স্পিন সহ ..

আমি একাধিক স্ট্যাটিক পদ্ধতিযুক্ত একটি শ্রেণি তৈরি করব (এবং প্রায়শই করি)। উদাহরণ স্বরূপ:

classdef Statistics

    methods(Static)
        function val = MyMean(data)
            val = mean(data);
        end

        function val = MyStd(data)
            val = std(data);
        end
    end

end

পদ্ধতিগুলি স্থির হিসাবে আপনার ক্লাসটি ইনস্ট্যান্স করার দরকার নেই। আপনি নিম্নলিখিত ফাংশন কল:

data = 1:10;

mean = Statistics.MyMean(data);
std = Statistics.MyStd(data);     

4

আমি অকটাভের সাথে এক .m ফাইলে একাধিক ফাংশন সংজ্ঞায়িত করি এবং তারপরে .m ফাইলের মধ্যে থেকে কমান্ডটি ব্যবহার করি যেখানে আমাকে সেই ফাইল থেকে ফাংশনগুলি ব্যবহার করতে হবে:

source("mycode.m");

এটি মাতলাবের সাথে পাওয়া যায় কিনা তা নিশ্চিত নয়।

octave:8> help source
'source' is a built-in function

 -- Built-in Function:  source (FILE)
     Parse and execute the contents of FILE.  This is equivalent to
     executing commands from a script file, but without requiring the
     file to be named `FILE.m'.

3

আপনি মূল ফাংশনটির সাথে একসাথে একটি প্রধান ফাইলে গ্রুপ ফাংশনগুলিও দেখতে পারেন:

function [varargout] = main( subfun, varargin )
[varargout{1:nargout}] = feval( subfun, varargin{:} ); 

% paste your subfunctions below ....
function str=subfun1
str='hello'

তারপরে সাবফুন 1 টি কল করার মতো দেখতে পাবেন: str = main ('subfun1')


0

R2017b হিসাবে, এটি আনুষ্ঠানিকভাবে সম্ভব নয়। প্রাসঙ্গিক ডকুমেন্টেশন রাজ্যের যে:

প্রোগ্রাম ফাইলগুলিতে একাধিক ফাংশন থাকতে পারে। যদি ফাইলটিতে কেবল ফাংশন সংজ্ঞা থাকে তবে প্রথম ফাংশনটি হ'ল প্রধান ফাংশন এবং এটি ফাংশন যা ম্যাটল্যাব ফাইলের নামের সাথে যুক্ত করে। মূল ফাংশন বা স্ক্রিপ্ট কোড অনুসরণ করে এমন ফাংশনগুলিকে স্থানীয় ফাংশন বলা হয়। স্থানীয় ফাংশনগুলি কেবলমাত্র ফাইলের মধ্যেই উপলব্ধ।

যাইহোক, অন্যান্য উত্তরে প্রস্তাবিত কর্মক্ষেত্রগুলি অনুরূপ কিছু অর্জন করতে পারে।


জनोভিস তার উত্তরের শুরুতে ঠিক যা বলেছিলেন তা নয়?
অ্যাডিয়েল

@ অ্যাডিল সম্ভবত, কিন্তু এই উত্তরটি পেরিয়ে বেশ কয়েক বছর কেটে গিয়েছিল এবং কেউ হয়তো ভাবতে পারে যে কিছু পরিবর্তন হয়েছে কিনা।
ডেভ-আইএল

আমি কিছু পেলাম না এখনও? :)
অ্যাডিয়েল

নাঃ। এই নির্দিষ্ট বিষয়টিকে সম্বোধন করার জন্য যুক্ত হতে পারে এমন কিছু ডকুমেন্টেশন ছাড়াও।
দেব-আইএল

আমি এই উত্তরটি লেখার কারণটি হ'ল কারণ বেশ কয়েকটি প্রকাশনা পূর্বে তারা এমন ফাংশনগুলি প্রবর্তন করেছিল যা আপনি স্ক্রিপ্টগুলির শেষের দিকে যুক্ত করতে পারেন - সুতরাং কেউ ভাবতে পারে যে এই ক্ষেত্রেও কিছু পরিবর্তন হয়েছে কিনা (উত্তর: না)।
দেব-আইএল

-1

আমি এসসিএফআরঞ্চ এবং অষ্টাভে রু রুশার সাথে চেষ্টা করেছি ।

এবং অবশেষে এটি কাজ করে: তবে আমি কিছু পরিবর্তন করেছি

function message = makefuns
    assignin('base','fun1', @fun1);   % Ru Hasha
    assignin('base', 'fun2', @fun2);  % Ru Hasha
    message.fun1=@fun1;               % SCFrench
    message.fun2=@fun2;               % SCFrench
end

function y=fun1(x)
    y=x;
end

function z=fun2
    z=1;
end

অন্যান্য 'এম' ফাইলটিতে কল করা যেতে পারে:

printf("%d\n", makefuns.fun1(123));
printf("%d\n", makefuns.fun2());

হালনাগাদ:

আমি একটি উত্তর যুক্ত করেছি কারণ +72 বা +20 কেউই আমার পক্ষে অষ্টাভে কাজ করেনি । আমি যেটি লিখেছি তা পুরোপুরি কাজ করে (এবং আমি পরে শুক্রবার পোস্টটি লেখার পরে গত শুক্রবার এটি পরীক্ষা করেছি)


2
আপনি যে দুটি বিদ্যমান উত্তর থেকে অনুলিপি করছেন তার থেকে এটি কীভাবে আলাদা করে তা ব্যাখ্যা করতে পারলে আমি আমার ডাউনটোটটি সরিয়ে ফেলব। আগে মন্তব্য না করার জন্য দুঃখিত। আমি কেবল দেখতে পাচ্ছি না যে এটি কীভাবে আলাদা, আপনি উভয় পদ্ধতিকে একটি ফাংশনে একত্রিত করে এবং অতএব অপ্রয়োজনীয় কিছু করছেন। এছাড়াও, দয়া করে আপনি যে উত্তরগুলি উল্লেখ করছেন তার যথাযথ লিঙ্কগুলি সন্নিবেশ করান, "+72" এবং "+20" বেশ ক্রিপ্টিক, আপনি ভোট গণনার বিষয়ে উল্লেখ করছেন বুঝতে পেরে আমাকে কিছুটা সময় লেগেছিল, যা সময়ের সাথে সাথে পরিবর্তিত হয়ে আপনার উল্লেখগুলি তৈরি করবে অপাচ্য।
ক্রিস লুয়েংগো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.