ম্যাটল্যাবে কি পূর্বাভাস আছে? যদি তাই হয় তবে অন্তর্নিহিত ডেটা পরিবর্তিত হলে এটি কীভাবে আচরণ করবে?


170

ম্যাটল্যাবে কি ফোরচ স্ট্রাকচার আছে? যদি তাই হয় তবে অন্তর্নিহিত ডেটা পরিবর্তিত হলে (কীভাবে বস্তুগুলিকে সেটে যুক্ত করা হয়) কী ঘটে?

উত্তর:


146

ম্যাটল্যাবের ফর লুপ প্রকৃতিতে স্থির; আপনি অন্যান্য ভাষার লুপ কাঠামোর (ইনিশিয়েশন; শর্ত; বৃদ্ধি) এর বিপরীতে পুনরাবৃত্তির মধ্যে লুপের পরিবর্তনশীলটি সংশোধন করতে পারবেন না । এর অর্থ হ'ল নিম্নলিখিত কোডটি বি এর মান নির্বিশেষে সর্বদা 1, 2, 3, 4, 5 মুদ্রণ করে that

A = 1:5;

for i = A
    A = B;
    disp(i);
end

যদি আপনি পুনরাবৃত্তির সময় ডেটা কাঠামোর পরিবর্তনের প্রতিক্রিয়া জানাতে সক্ষম হতে চান তবে একটি WHILE লুপ আরও উপযুক্ত হতে পারে --- আপনি প্রতিটি পুনরাবৃত্তিতে লুপের শর্তটি পরীক্ষা করতে পারবেন এবং লুপ ভেরিয়েবলের মান সেট করতে পারবেন ( s) আপনার ইচ্ছামতো:

n = 10;
f = n;
while n > 1
    n = n-1;
    f = f*n;
end
disp(['n! = ' num2str(f)])

বিটিডব্লিউ, জাভা -এর প্রতিটি লুপ (এবং সম্ভবত অন্যান্য ভাষাগুলি) অনির্দিষ্ট আচরণ তৈরি করে যখন পুনরাবৃত্তির সময় ডেটা স্ট্রাকচারটি সংশোধন করা হয়। যদি আপনাকে ডেটা কাঠামোটি সংশোধন করতে হয় তবে আপনার উচিত একটি উপযুক্ত আইট্রেটার উদাহরণ যা আপনাকে পুনরাবৃত্তি করছে এমন সংগ্রহের উপাদানগুলি সংযোজন এবং অপসারণের অনুমতি দেয়। সুসংবাদটি হ'ল ম্যাটল্যাব জাভা অবজেক্টগুলিকে সমর্থন করে, তাই আপনি এরকম কিছু করতে পারেন:

A = java.util.ArrayList();
A.add(1);
A.add(2);
A.add(3);
A.add(4);
A.add(5);

itr = A.listIterator();

while itr.hasNext()

    k = itr.next();
    disp(k);

    % modify data structure while iterating
    itr.remove();
    itr.add(k);

end

1
বি যদি অপরিজ্ঞাত হয় তবে আপনার প্রথম উদাহরণটি 1-5 থেকে মুদ্রণ করবে না। এটি মুদ্রণ Undefined function or variable 'B'
ক্লিস্ট

3
1 ম উদাহরণের জন্য নিশ্চিত করুন যে Aএটি একটি সারি ভেক্টর, কলাম ভেক্টর নয়। যদি Aম্যাট্রিক্স হয়, প্রতিটি কে সেই ম্যাট্রিক্সের কলাম ভেক্টর হবে। সুতরাং, প্রয়োজন হলে স্থানান্তর ( A') বা ভেক্টরাইজ ( A(:)')।
yuk

3
-1 আমি মনে করি না যে জাভা-জাতীয় কোডটি .mফাইলগুলিতে মতলবের সাথে কাজ করার জন্য আপনার প্রথম পছন্দ way
bobobobo

1
ভবিষ্যতের পক্ষ থেকে শুভেচ্ছা; আমরা পুনরাবৃত্তিযোগ্য অবৈধ সমস্যাটির প্রচুর সমাধান নিয়ে আসি।
দিমিত্রি

89

প্রশ্নের সরাসরি উত্তর সম্পর্কে জ্যাচ সঠিক।

একটি আকর্ষণীয় পার্শ্ব নোট নিম্নলিখিত দুটি লুপ একই কার্যকর করে না:

for i=1:10000
  % do something
end
for i=[1:10000]
  % do something
end

প্রথম লুপটি একটি ভেরিয়েবল তৈরি করে iযা একটি স্কেলার এবং এটি এটি লুপের জন্য সি এর মতো পুনরাবৃত্তি করে। নোট করুন যে আপনি iলুপের শরীরে সংশোধন করলে , পরিবর্তিত মানটি অগ্রাহ্য করা হবে, যা জাচ বলেছে। দ্বিতীয় ক্ষেত্রে, মতলব একটি 10 ​​কে-উপাদান অ্যারে তৈরি করে, তারপরে এটি অ্যারের সমস্ত উপাদানকে নিয়ে যায়।

এর অর্থ কী

for i=1:inf
  % do something
end

কাজ করে, কিন্তু

for i=[1:inf]
  % do something
end

না (কারণ এটির জন্য অসীম স্মৃতি বরাদ্দ প্রয়োজন)। বিশদ জন্য লরেন ব্লগ দেখুন ।

এছাড়াও খেয়াল করুন যে আপনি সেল অ্যারেতে পুনরাবৃত্তি করতে পারেন।


2
হ্যাঁ, আমি যখন এটির মধ্যে ছুটে এসেছি তখন আমি অবাক হয়েছি। অ্যারেগুলির এই অপ্টিমাইজেশনটি আসলে অনেক জায়গায় ঘটে। আপনি যদি বন্ধনী স্বরলিপি ব্যবহার করেন, কখনও কখনও আপনি মতলব সম্পাদকটিতে পারফরম্যান্স সতর্কতা দেখতে পাবেন যা আপনাকে মনে করে এটি অ্যারে বরাদ্দকে অনুকূলিত করতে পারে বলে মনে করে।
মিঃ ফুজ

শুনেছি মতলব এখন অলস মূল্যায়ন করেছেন। যদি তা না হয় তবে সেগুলি বাস্তবায়নের জন্য আমাদের কাছে প্রযুক্তি রয়েছে।
দিমিত্রি

19

লুপের জন্য ম্যাটল্যাব মূলত: সহ বৃহত্তর নমনীয়তার অনুমতি দেয়কার্যকারিতা। এখানে কয়েকটি উদাহরণ:

1) সূচনা, বৃদ্ধি এবং শেষ সূচক নির্ধারণ করুন

for test = 1:3:9
   test
end

2) ভেক্টর লুপ

for test = [1, 3, 4]
   test
end

3) স্ট্রিং লুপ

for test = 'hello'
   test
end

4) এক-মাত্রিক সেল অ্যারের উপরে লুপ করুন

for test = {'hello', 42, datestr(now) ,1:3}
   test
end

5) একটি দ্বিমাত্রিক সেল অ্যারের উপরে লুপ করুন

for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
   test(1)   
   test(2)
   disp('---')
end

)) কাঠামোর অ্যারেগুলির ক্ষেত্রের নামগুলি ব্যবহার করুন

s.a = 1:3 ; s.b = 10  ; 
for test = fieldnames(s)'
   s.(cell2mat(test))
end

4
ঘর অ্যারে সহ, দ্রষ্টব্য রাখুন যে এটি সেল অ্যারের কলামগুলিতে পুনরাবৃত্তি করবে ।
এভেজেনি সার্জিভ

17

আপনি যদি কোনও সেল অ্যারে লুপ করার চেষ্টা করছেন এবং ঘরের প্রতিটি উপাদানকে কিছু প্রয়োগ করতে চান তবে দেখুন cellfun। এছাড়াও আছে arrayfun, bsxfunএবং structfunযা আপনার প্রোগ্রাম প্রক্রিয়া সহজ করতে পারে।


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

14

Ooh! ঝরঝরে প্রশ্ন

ল্যাটুপের জন্য লুপ ইনপুট হিসাবে একটি ম্যাট্রিক্স নেয় এবং এর কলামগুলিতে পুনরাবৃত্তি করে। মতলবও কার্যত প্রতিটি জিনিসকে মান দ্বারা পরিচালনা করে (কোনও পাস-বাই-রেফারেন্স নয়) তাই আমি আশা করব যে এটি অপরিবর্তনীয়ভাবে লুপের ইনপুটটির স্ন্যাপশট নেয়।

এখানে একটি উদাহরণ যা চিত্রিত করতে সহায়তা করতে পারে:

>> A = zeros(4); A(:) = 1:16

A =

     1     5     9    13
     2     6    10    14
     3     7    11    15
     4     8    12    16

>> i = 1; for col = A; disp(col'); A(:,i) = i; i = i + 1; end;
     1     2     3     4

     5     6     7     8

     9    10    11    12

    13    14    15    16

>> A

A =

     1     2     3     4
     1     2     3     4
     1     2     3     4
     1     2     3     4

7

স্ট্রিংয়ের সেল অ্যারেগুলি পুনরাবৃত্তি করার সময়, লুপ ভেরিয়েবল (আসুন এটি কল করি f) একটি একক-উপাদান সেল অ্যারে হয়ে যায়। f{1}সর্বত্র লেখার জন্য ক্লান্তিকর হয়ে ওঠে এবং লুপের ভেরিয়েবলটি সংশোধন করা একটি পরিষ্কার কাজের সুযোগ দেয়।

% This example transposes each field of a struct.
s.a = 1:3;
s.b = zeros(2,3);
s % a: [1 2 3]; b: [2x3 double]
for f = fieldnames(s)'
    s.(f{1}) = s.(f{1})';
end
s % a: [3x1 double]; b: [3x2 double]

% Redefining f simplifies the indexing.
for f = fieldnames(s)'
    f = f{1};
    s.(f) = s.(f)';
end
s % back to a: [1 2 3]; b: [2x3 double]

5

ধরা যাক আপনার কাছে ডেটার অ্যারে রয়েছে:

n = [1    2   3   4   6   12  18  51  69  81  ]

তারপরে আপনি এটিকে এভাবে 'ভবিষ্যদ্বাণী' করতে পারেন:

for i = n, i, end

এটি এন এর প্রতিটি উপাদান প্রতিধ্বনিত করবে (তবে আরও আকর্ষণীয় জিনিসগুলির সাথে i প্রতিস্থাপন করা অবশ্যই সম্ভব!)


4

আমি মনে করি ওপি সত্যই এটি চায়:

array = -1:0.1:10

for i=1:numel(array)
    disp(array(i))
end

numel(array)অ্যারে উপাদানগুলির সংখ্যা হওয়ায় এটি কেবল 10 টি মুদ্রণ করে । সম্ভবত আপনি বোঝাতে চেয়েছিলেন 1:numel(array)?
ক্লিস্ট

for i = -1:0.1:10; disp(i); end;ভাল হবে না ?
ওরিওল

4

আজ (27 ফেব্রুয়ারি) অবধি, ম্যাটল্যাব ফাইল এক্সচেঞ্জে একটি নতুন জন্য প্রতিটি টুলবক্স রয়েছে যা এর ধারণাটি সম্পাদন করে foreachforeachম্যাটল্যাব ভাষার একটি অংশ নয় তবে এই সরঞ্জামবাক্সটির ব্যবহার আমাদের কী foreachকরবে তা অনুকরণ করার ক্ষমতা দেয় ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.