মতলবটিতে 'ফর' লুপ লেখার সর্বাধিক দক্ষ উপায় কোনটি?


12

আমি পড়েছি যে, উদাহরণস্বরূপ, যদি আমার একটি ডাবল forলুপ থাকে যা ম্যাট্রিক্সের সূচকগুলির উপরে চলে যায় তবে কলাম চলমান সূচকে বাইরের লুপে রাখলে আরও কার্যকর। উদাহরণ স্বরূপ:

a=zeros(1000);
for j=1:1000
 for i=1:1000
  a(i,j)=1;
 end
end

আমার কাছে তিন বা ততোধিক forলুপ থাকলে এটিকে কোড করার সবচেয়ে কার্যকর উপায় কী ?

উদাহরণ স্বরূপ:

a=zeros(100,100,100);
for j=1:100
 for i=1:100
  for k=1:100
   a(i,j,k)=1;
  end
 end
end

4
Forলুপগুলি এমএটিএলবিতে খুব ধীর। আপনার যখনই সম্ভব ম্যাটল্যাবে স্পষ্ট লুপগুলি এড়ানো উচিত। পরিবর্তে, সাধারণত ম্যাট্রিক্স / ভেক্টর অপারেশনগুলির ক্ষেত্রে কোনও সমস্যা প্রকাশ করা যায়। এটি ম্যাটল্যাবিক উপায়। ম্যাট্রিক্স ইত্যাদির সূচনা করার জন্য অনেকগুলি অন্তর্নির্মিত ফাংশন রয়েছে instance উদাহরণস্বরূপ, একটি ফাংশন রয়েছে , যা () রয়েছে , যা ম্যাট্রিক্সের সমস্ত উপাদানকে 1 (এক্সটেনশন দ্বারা, গুণফলের দ্বারা কোনও মানকে সেট করবে ) অল-ওয়াল ম্যাট্রিক্স দ্বারা গুণিত))। এটি 3-ডি অ্যারেগুলিতেও কাজ করে (যা আমি মনে করি এখানে উদাহরণটি আবরণ করে)।
পিটার মর্টেনসেন

3
@ পিটারমোরটেনসেন কোন কারণের মাধ্যমে (মোটামুটিভাবে) ম্যাট্লাবের লুপগুলির কার্যকারিতা সি এবং পাইথনের তুলনায় কম? এবং এটা কেন? এছাড়াও, গত কয়েক বছরে মতলব-র লুপগুলির দক্ষতা আরও ভাল হয়নি?
টেনসোর

3
@ পিটারমোরটেনসেন "ম্যাট্রিক্স / ভেক্টর অপারেশনগুলির ক্ষেত্রে সাধারণত একটি সমস্যা প্রকাশ করা যায়" - হ্যাঁ, "সাধারণত" এর নির্দিষ্ট মানগুলির জন্য। আইএমও এটি আরও সঠিকভাবে বলা যায় যে মতলব এবং এর মতো লোকেরা কাজ করছেন এমন কয়েক দশক ধরে সংস্কৃতি রয়েছে যা ম্যাট্রিক্স / ভেক্টর অপারেশন দিয়ে করা যায় না এমন সমস্ত বিষয়কে উপেক্ষা করে, এতটা যে তাদের হাতুড়িটির জন্য পেরেকের মতো দেখায় everything । এবং আমাদের কেবল বলা উচিত নয় যে "মতলবের লুপগুলি ধীর" তবে "মতলব ধীর গতি" (এটি কেবল সি এবং ফোরট্রানে লেখা এলএ আদিমদের একটি দ্রুত গ্রন্থাগারের সাথে সংযুক্ত রয়েছে)।

5
লুপগুলির জন্য অভিনয় বিতর্কিত: matlabtips.com/matlab-is-no-longer-slow-at-for-loops
ওরেলি

নিখুঁত দ্বিখাদিত (বা আধা-ব্যাখ্যা করা) ভাষার গতি সম্পর্কে উদ্বিগ্ন হওয়া আপনার একটি এক্সওয়াই সমস্যা রয়েছে যেখানে প্রকৃত সমাধানটি "এই ভাষাটি ব্যবহার করবেন না" pretty অবশ্যই ব্যতিক্রমটি যদি আপনি সিমুলিঙ্কে কোড জেনারেশন ব্যবহার করে থাকেন তবে তবে প্রশ্নটি কোড জেনারেটরটি কী তৈরি করে এবং এটি কতটা কার্যকর।
গ্রাহাম

উত্তর:


18

সংক্ষিপ্ত উত্তর, আপনি অন্তঃস্থলীয় লুপের বামতম সূচি রাখতে চান। আপনার উদাহরণে লুপ সূচকগুলি কে, জে, আই এবং অ্যারের সূচকগুলি হবে আমি, জে, কে k এটি কীভাবে ম্যাটল্যাব মেমরির বিভিন্ন মাত্রা সংরক্ষণ করে। আরও তথ্যের জন্য, এই reddit পোস্টের # 13 দেখুন ।


2
অথবা অন্তর্নির্মিত ফাংশনগুলি () ব্যবহার করুন
পিটার মর্টেনসেন

5
@ পিটার ওপির উদাহরণটি অবশ্যই লুপের জন্য একটি খেলনার উদাহরণ যা কিছু করে এবং আসল ব্যবহারের ক্ষেত্রে না।
ম্যাট

@ ম্যাট আপনি সঠিক।
টেনসোর

11

কিছুটা দীর্ঘতর উত্তর যা ব্যাখ্যা করে যে বাম সর্বাধিক সূচকটি খুব দ্রুত পরিবর্তিত হওয়া কেন এটি আরও দক্ষ। দুটি মূল বিষয় যা আপনার বুঝতে হবে।

প্রথমে, ম্যাটল্যাব (এবং ফোর্টরান, তবে সি এবং অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজ নয়) মেমরিতে অ্যারেগুলি "কলামের বড় ক্রমে" সঞ্চয় করে। উদাহরণস্বরূপ, যদি এ 2 দ্বারা 3 বাই 10 ম্যাট্রিক্স হয়, তবে এন্ট্রিগুলি ক্রমে মেমরিতে সংরক্ষণ করা হবে

এ (1,1,1)

এ (2,1,1)

এ (1,2,1)

এ (2,2,1)

এ (1,3,1)

এ (2,3,1)

এ (1,1,2)

এ (2,1,2)

...

এ (2,3,10)

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

দ্বিতীয়টি গুরুত্বপূর্ণ যেটি আপনি বুঝতে হবে তা হ'ল আধুনিক প্রসেসরগুলি একসাথে মেমরির এক অবস্থান অ্যাক্সেস করে না, বরং 64 বা 128 সংক্ষিপ্ত বাইটের (8 বা 16 ডাবল যথার্থ ভাসমান পয়েন্ট সংখ্যা) এর "ক্যাশে লাইনগুলি" লোড এবং সঞ্চয় করে) স্মৃতি থেকে এক সময় এই অংশগুলির ডেটাগুলি অস্থায়ীভাবে একটি দ্রুত মেমরি ক্যাশে সংরক্ষণ করা হয় এবং প্রয়োজনীয় হিসাবে ফিরে লেখা হয়। (অনুশীলনে ক্যাশে আর্কিটেকচারটি এখন প্রায় 3 বা 4 স্তরের ক্যাশে মেমোরির সাথে জটিল, তবে আমার প্রাথমিক যুগে কম্পিউটারগুলি যে ধরণের ছিল তার এক-স্তরের ক্যাশে মূল ধারণাটি ব্যাখ্যা করা যেতে পারে))

A

যদি লুপগুলি বাসা বেঁধে রাখা হয় যাতে অন্তঃস্থলীয় লুপটি সারি সাবস্ক্রিপ্ট আপডেট করে, তবে অ্যারের এন্ট্রি A (1,1), A (2,1), A (3,1), ... ক্রমে অ্যাক্সেস করা হবে ... প্রথম এন্ট্রি এ (1,1) অ্যাক্সেস করা হয়েছে, সিস্টেমটি মূল স্মৃতি থেকে ক্যাশে একটি (1,1), এ (2,1), ..., এ (8,1) সমন্বিত একটি ক্যাশে লাইন এনে দেবে । অভ্যন্তরীণ লুপের পরবর্তী 8 পুনরাবৃত্তিগুলি কোনও অতিরিক্ত প্রধান মেমরি স্থানান্তর ছাড়াই এই ডেটাতে কাজ করে।

বিকল্পের ক্ষেত্রে, আমরা লুপগুলি এমনভাবে গঠন করি যাতে কলাম সূচকটি অন্তঃস্থলীয় লুপে পরিবর্তিত হয়, তবে A এর এন্ট্রিগুলি A (1,1), A (1,2), A (1,3) ক্রমানুসারে প্রবেশ করা হবে ), ... এই ক্ষেত্রে, প্রথম অ্যাক্সেস এ এ (1,1), এ (2,1), ..., এ (8,1) কে মূল স্মৃতি থেকে ক্যাশে আনবে, তবে এর 7/8 এই এন্ট্রি ব্যবহার করা হবে না। দ্বিতীয় পুনরাবৃত্তিতে A (1,2) এর অ্যাক্সেসের পরে মূল স্মৃতি থেকে আরও 8 টি এন্ট্রি আসবে এবং এগুলি। কোডটি ম্যাট্রিক্সের ২ য় সারিতে কাজ করার সময়, এ (২,১) এন্ট্রি অন্যান্য প্রয়োজনীয় ডেটার জন্য উপায় তৈরি করতে ক্যাশে থেকে ভালভাবে বেরিয়ে যেতে পারে। ফলস্বরূপ, কোডটি প্রয়োজনীয় হিসাবে 8 গুণ বেশি ট্র্যাফিক তৈরি করছে।

কিছু অপ্টিমাইজ করা সংকলক এই সমস্যাটি এড়াতে স্বয়ংক্রিয়ভাবে লুপগুলি পুনর্গঠন করতে সক্ষম।

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

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