কোনও স্থানীয় ভেরিয়েবলকে প্রথমে বরাদ্দ না দিয়ে কোনও ফাংশন দ্বারা ফেরত একটি ম্যাটল্যাব অ্যারে আমি কীভাবে সূচক করব?


363

উদাহরণস্বরূপ, আমি যদি মধ্যম মানটি থেকে পড়তে চাই তবে আমি এটি এর magic(5)মতো করতে পারি:

M = magic(5);
value = M(3,3);

পেতে value == 13। আমি এর একটির মতো কিছু করতে সক্ষম হতে চাই:

value = magic(5)(3,3);
value = (magic(5))(3,3);

মধ্যবর্তী পরিবর্তনশীল সাথে বিতরণ। যাইহোক, ম্যাটল্যাব এর Unbalanced or unexpected parenthesis or bracketআগে প্রথম প্রথম বন্ধনী সম্পর্কে অভিযোগ করেছে 3

কোনও অ্যারে / ম্যাট্রিক্স থেকে প্রথমে কোনও ভেরিয়েবলকে বরাদ্দ না করে মানগুলি পড়া কি সম্ভব?


2
আমি এই থিমটিতে নিম্নলিখিত নিবন্ধটিও পেয়েছি: mathworks.com/matlabcentral/newsreader/view_thread/280225 এই থিমের বিষয়ে কারও কাছে নতুন তথ্য রয়েছে, এটি বাস্তবায়ন হবে?

2
এই সিনট্যাক্সটি বাস্তবে অষ্টাভে ভালভাবে কাজ করে। আমি কেবল তখনই এই সমস্যাটি আবিষ্কার করেছি যখন আমার সহকর্মীরা যারা ম্যাটল্যাব ব্যবহার করে তাদের আমার কোড চালাতে সমস্যা হচ্ছিল।
sffc

2
সংক্ষেপে ম্যাটল্যাব।
ব্যবহারকারী 76284

1
রিকার্সিভ এক্সট্রাকশনটি সংস্করণ 6. থেকে সায়্লাব ( সাইল্যাব.অর্গ ) -এও কাজ করে
স্টাফেন মোটলেট

দ্য testmatrix('magi', 5)(3, 3)সাইল্যাব এবং magic(5)(3, 3)অক্টেভ উভয়ই কবজির মতো কাজ করে!
ফোড

উত্তর:


384

আপনি যা চান তা বাস্তবে করা সম্ভব তবে আপনাকে সূচক অপারেটরের ক্রিয়ামূলক ফর্মটি ব্যবহার করতে হবে। আপনি যখন ব্যবহার করে একটি সূচক অপারেশন করেন (), আপনি আসলে subsrefফাংশনে একটি কল করছেন । সুতরাং, আপনি এটি করতে না পারলেও:

value = magic(5)(3, 3);

আপনি এটি করতে পারেন:

value = subsref(magic(5), struct('type', '()', 'subs', {{3, 3}}));

কুরুচিপূর্ণ, তবে সম্ভব। ;)

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

subindex = @(A, r, c) A(r, c);     % An anonymous function for 2-D indexing
value = subindex(magic(5), 3, 3);  % Use the function to index the matrix

যাইহোক, যখন সমস্ত বলা হয় এবং করা হয় তখন অস্থায়ী স্থানীয় পরিবর্তনশীল সমাধান অনেক বেশি বেশি পঠনযোগ্য হয় এবং অবশ্যই আমি কী পরামর্শ দেব।


26
ভাল, তুমি কি জানো! যদিও আমি সম্মত হলাম এটি বেশ কুৎসিত, এবং কোনও টেম্প-ওয়ার সমাধানের চেয়ে কম পঠনযোগ্য। চিত্তাকর্ষক অস্পষ্ট মতলব জ্ঞানের জন্য +1!
দ্বিতীয়

57
এটি জঘন্য, তবে একটি খুব স্পষ্ট উত্তর। ভাল কাজ! অনুমান করা উচিত ছিল যে এটির পিছনে একটি উপায় ছিল। আমি ভাবব আমি টেম্প ভেরিয়েবলটি নিয়ে চলব।
জো

29
মনে রাখবেন যে মধ্যবর্তী ভেরিয়েবলটি এখনও সম্পূর্ণরূপে তৈরি হয়েছে। সুতরাং উদ্দেশ্যটি যদি অস্থায়ী স্থানীয় পরিবর্তনশীল তৈরি না করে স্মৃতি সঞ্চয় করা হয় তবে ভাগ্য নেই।
স্যাম রবার্টস

8
@ সামরবার্টস: মতলব-এর মতো কঠোর-মূল্যায়নের ভাষায় আপনি সত্যিকার অর্থে এটি পেতে পারেন না। লোকেরা এটি চাওয়ার মূল কারণ হ'ল সংক্ষিপ্ততা / পঠনযোগ্যতা, মেমরি সঞ্চয় নয়।
যান্ত্রিক শামুক 7

5
@SamRoberts: সত্য, কিন্তু এটা করে কলিং বোঝা থেকে আপনি সংরক্ষণ clearঅস্থায়ী উপর (যা কেউ কি কখনো আছে) - অস্থায়ী প্রায় আর বিদ্ধ থাকে
Rody Oldenhuis

131

ওখান থেকেই ভাল ব্লগ পোস্ট উপর মতলব আর্ট উপর লরেন দুয়েক দিন আগে একটি দম্পতি রত্ন যে শক্তি সাহায্যে। বিশেষত, সহায়ক ফাংশনগুলি ব্যবহার করে যেমন:

paren = @(x, varargin) x(varargin{:});
curly = @(x, varargin) x{varargin{:}};

যেখানে paren()ব্যবহার করা যেতে পারে

paren(magic(5), 3, 3);

ফিরে আসবে

ans = 16

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

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


2
এটি জিনোভাইসের উত্তরের দ্বিতীয়ার্ধের কিছুটা সাধারণ সংস্করণ; এটাও ভাল.
জো কেয়ার্নি

কি হবে myfunc().attr?
15-25

@ জিরিট, কীভাবে সাহায্য করবে? এবং আপনার কাছে ডাটাবেস সরঞ্জামবক্স না থাকলে x.attr () ক্ষেত্র উপলব্ধ নয়।
টি ফুরফারো

@ টি.ফুরফারো হাহ? যদি myfunc()কোনও বৈশিষ্ট্য অন্তর্ভুক্ত এমন কোনও কাঠামো ফেরত দেয় attr, তবে অ্যাক্সেস করার জন্য attrআমাকে এখনই করতে হবে S = myfunc(); S.attr। প্রশ্নটি হ'ল আমরা যদি সহায়ক এবং সহায়তাকারীদের getattr(myfunc(), 'attr')সাথে সাদৃশ্য মতো কোনও সহায়ক ফাংশন রাখতে পারি । এটি ডেটাবেস টুলবক্সের সাথে কী করার তা আমি বুঝতে পারি না। parencurly
জিরিট

2
@ জারিট দুঃখিত, মোট বিভ্রান্তি (আমি জানি না যে আপনার "অ্যাট্রি" নির্বিচারে ছিল - ডিবি টিবিতে এরকম ক্ষেত্রের স্পষ্টতা সংজ্ঞায়িত হয়েছে)। আমি বিশ্বাস করি আপনি যা খুঁজছেন তা হ'ল গেটফিল্ড ()
টি ফুরফারো

75

অননুমোদিত বৈশিষ্ট্যগুলি ব্যবহার সম্পর্কে আপনি কেমন অনুভব করছেন:

>> builtin('_paren', magic(5), 3, 3)               %# M(3,3)
ans =
    13

বা সেল অ্যারেগুলির জন্য:

>> builtin('_brace', num2cell(magic(5)), 3, 3)     %# C{3,3}
ans =
    13

ঠিক যাদু :)


হালনাগাদ:

খারাপ খবর, উপরের হ্যাক আর 2015 বি তে আর কাজ করে না ! এটি ঠিক আছে, এটি অনির্ধারিত কার্যকারিতা ছিল এবং আমরা এটি কোনও সমর্থিত বৈশিষ্ট্য হিসাবে নির্ভর করতে পারি না :)

যারা এই ধরণের জিনিসটি কোথায় পাবেন সে সম্পর্কে ভাবছেন, ফোল্ডারে দেখুন fullfile(matlabroot,'bin','registry')। সেখানে একগুচ্ছ এক্সএমএল ফাইল রয়েছে যা সমস্ত ধরণের গুডির তালিকা করে। সতর্কতা অবলম্বন করুন যে এর মধ্যে কয়েকটি ফাংশন সরাসরি কল করা আপনার ম্যাটল্যাব সেশনটি সহজেই ক্র্যাশ করতে পারে।


@ রডিয়াল্ডেনহুইস: আমি এখনই মনে করতে পারছি না, আমার ধারণা আমি অবশ্যই এটি কোনও কবরযুক্ত কোডে পড়েছি;)
আমরো

2
':'ত্রুটি এড়াতে কোলন (:) অপারেটরটি অবশ্যই অ্যাস্ট্রোফেসের সাথে ব্যবহার করা উচিত Undefined function or variable "builtin"
ডোমিনিক

@Dominik: ডান, আপনি 2nd কলাম যেভাবেই করতে চান বলে, যে হতে হবে: builtin('_paren', magic(5), ':', 2)(কিছু জায়গায় এটা কাজ উদ্ধৃতি ছাড়া সরাসরি যেমন করে :যেমন উল্টোদিকে ':'যখন কম্যান্ড প্রম্প্ট একটি ফাংশন ভিতরে থেকে সরাসরি চলমান না মত, আমি অনুমান। এটি পার্সারে একটি বাগ!)
আম্রো

2
আমি মনে করি না এটি ব্যবহারের কিছু উপায় আছে end?
knedlsepp

2
@ কেনডেলসপ: না, দুর্ভাগ্যক্রমে পুরো endকৌশলটি এই সিনট্যাক্সটিতে কাজ করে না, আপনাকে আপনার সূচীগুলিতে স্পষ্ট করতে হবে .. (একই সীমাবদ্ধতা বেশিরভাগ অন্যান্য তালিকাভুক্ত উত্তরের জন্য প্রযোজ্য)
আমরো

54

কমপক্ষে ম্যাটল্যাব 2013 এ আপনি এই জাতীয় ব্যবহার করতে পারেন getfield:

a=rand(5);
getfield(a,{1,2}) % etc

(1,2) এ উপাদান পেতে


5
এটি আসলে একটি দুর্দান্ত পদ্ধতি। কোন ত্রুটি?
মিম্বুবস

6
@ মিমবস: এটি অননুমোদিত আচরণ, ভবিষ্যতের সংস্করণগুলিতে বিজ্ঞপ্তি ছাড়াই এই কার্যকারিতাটি অদৃশ্য হয়ে যেতে পারে। এটি ছাড়াও কোনও অসুবিধা নেই।
ড্যানিয়েল

6
MATLAB2017b হিসাবে, এই কার্যকারিতাটি নথিভুক্ত।
njspeer

15

দুর্ভাগ্যক্রমে সিনট্যাক্স magic(5)(3,3)মতল্যাব দ্বারা সমর্থিত নয়। আপনার অস্থায়ী মধ্যবর্তী ভেরিয়েবলগুলি ব্যবহার করা দরকার। আপনি ব্যবহারের পরে মেমরিটি মুক্ত করতে পারেন, যেমন

tmp = magic(3);
myVar = tmp(3,3);
clear tmp

12

মনে রাখবেন যে আপনি যদি চলমান সময়গুলিকে স্ট্যান্ডার্ড উপায়ে (ফলাফলটি স্বাক্ষর করুন এবং তারপরে প্রবেশের প্রবেশাধিকারের সাথে) তুলনা করেন তবে সেগুলি ঠিক একই।

subs=@(M,i,j) M(i,j);
>> for nit=1:10;tic;subs(magic(100),1:10,1:10);tlap(nit)=toc;end;mean(tlap)

ans =

0.0103

>> for nit=1:10,tic;M=magic(100); M(1:10,1:10);tlap(nit)=toc;end;mean(tlap)

ans =

0.0101

আমার মতে, নীচের লাইনটি: ম্যাটল্যাবের পয়েন্টার নেই, আপনাকে এটির সাথে বাঁচতে হবে।


6

আপনি যদি নতুন কোনও ফাংশন করেন তবে এটি আরও সহজ হতে পারে:

function [ element ] = getElem( matrix, index1, index2 )
    element = matrix(index1, index2);
end

এবং তারপরে এটি ব্যবহার করুন:

value = getElem(magic(5), 3, 3);

1
তবে এটি ঠিক তাই subrefকরে ... তবে আরও সাধারণ উপায়ে।
শাই

2
হ্যাঁ, আরও সাধারণ উপায়, তবে বন্ধুত্বপূর্ণ নয় ... আমার মতে অনেক কুৎসিত।
Vugar

4

আপনার প্রাথমিক স্বরলিপিটি এটি করার সবচেয়ে সংক্ষিপ্ত উপায়:

M = magic(5);  %create
value = M(3,3);  % extract useful data
clear M;  %free memory

আপনি যদি লুপটিতে এটি করে থাকেন তবে আপনি প্রতিবারই এমকে পুনরায় নিয়োগ করতে পারেন এবং পরিষ্কার বিবৃতিটি এড়িয়ে যেতে পারেন।


6
আমি সম্মত হই যে এটি আরও সংক্ষিপ্ত, এবং ক্লিয়ারিং একটি লুপে একটি ভাল ধারণা, যেমনটি আপনি বলেছেন, তবে প্রশ্নটি বিশেষত ছিল যে মধ্যবর্তী কার্যনির্বাহী কাজটি এড়ানো যায় কিনা।
জো কেয়ার্নি

1

আম্রোর উত্তর পরিপূরক করতে, আপনি এর fevalপরিবর্তে ব্যবহার করতে পারেন builtin। অপারেটর ফাংশনটি ওভারলোড করার চেষ্টা না করা পর্যন্ত আসলেই কোনও পার্থক্য নেই:

বিল্টিন (...) ফেভাল (...) হিসাবে সমান এটি ব্যতীত এটি কোনও অতিরিক্ত লোড উপস্থিত থাকলেও এটি ফাংশনের মূল অন্তর্নির্মিত সংস্করণটিকে কল করবে (এটি কাজ করার জন্য আপনাকে বিল্টিন কখনই ওভারলোড করতে হবে না)।

>> feval('_paren', magic(5), 3, 3)               % M(3,3)
ans =
    13

>> feval('_brace', num2cell(magic(5)), 3, 3)     % C{3,3}
ans =
    13

মজার বিষয়টি হ'ল এটি ম্যাটলব 2013 বি-তে কমপক্ষে (3.5% ডলার) এর fevalচেয়ে সামান্য কিছুটা দ্রুত বলে মনে হচ্ছে builtin, যা অদ্ভুত, যা fevalফাংশনটি খুব বেশি লোড হয়েছে কিনা তা পরীক্ষা করা প্রয়োজন builtin:

>> tic; for i=1:1e6, feval('_paren', magic(5), 3, 3); end; toc;
Elapsed time is 49.904117 seconds.
>> tic; for i=1:1e6, builtin('_paren', magic(5), 3, 3); end; toc;
Elapsed time is 51.485339 seconds.

এটি আসলে অদ্ভুত নয়: ম্যাটল্যাব সংজ্ঞায়িত ফাংশনগুলির একটি তালিকা রাখে, এর চেয়ে বেশি অনুসন্ধান করার দরকার নেই। feval"সাধারণ" জিনিসটি করে এবং তাই এই তালিকাটির পুরো ব্যবহার করতে পারে। builtinএটি অন্য কোথাও অনুসন্ধান করতে হবে যাতে এটি কেবল ফাংশনে নির্মিত finds সম্ভবত এই কেসটি "সাধারণ" মামলার মতো প্রায় অনুকূল নয়, কারণ আপনি খুব বেশি ব্যবহৃত না এমন কিছু কেন অনুকূলিতকরণে অর্থ কেন রাখবেন?
ক্রিস লুয়েংগো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.