🔵روش برداری یا حلقه؟🔵
(پیش نیاز: آشنایی مقدماتی با کدنویسی)
سطح پیچیدگی:🌕🌓🌑🌑🌑
چند سال پیش وقتی کمک درس MATLAB بودم در کلاس در مورد مزایای برداری سازی و دوری کردن از حلقه های for به شدت گرم صحبت بودم. سپس تصمیم گرفتم که به صورت زنده به دانشجویان نشان دهم که حرف هایم درست است، بنابراین تصمیم گرفتم برنامه ای مشابه برنامه زیر بنویسم:
این برنامه یک بردار از اعداد یک تا 10 میلیون را یک بار در حلقه for و دفعه بعدی به صورت برداری تک تک در 5 ضرب می کند. اما وقتی برنامه اجرا شد کاملا شوکه شدم چون حلقه سریع تر بود.(روی سیستم من الان)
For loop: 0.0923s
Vectorized: 0.1235s
بنابراین تصمیم گرفتم تغییرات دیگری در برنامه بدهم: مثلا تعداد را بیشتر کنم اما فایده ای نداشت. آنچه خوانده بودم انگار اشتباه بود. کم کم صدای خنده بچه ها بلند شده بود و من کاملا شرمنده شدم.
اما دلیل این اتفاق چه بود؟ چند سال پیش MATLAB یک قسمت به نام شتاب دهنده درجا (Just-In-Time(JIT) Accelerator) معرفی کرد. JIT در پشت صحنه اجرا می شود و بنابراین خیلی ها از آن خبر ندارند. وظیفه JIT آن است که کد های MATLAB را کامپایل می کند و دیگر به جای آن که خط به خط اجرا شود (چون MATLAB یک زبان مفسری است و به صورت پیش فرض باید خط به خط اجرا شود) قسمت هایی از کد را کامپایل کرده و در نهایت قسمت های کامپایل شده را اجرا می کند. حالا اگر به صورت دستی JIT را با دستور زیر خاموش کنیم:
نتایج به صورت زیر هستند:
For loop: 18.0181s
Vectorized: 0.1035s
همانطور که می بینید سرعت محاسبه برداری 174 برابر است.
تمام این ها را گفتم تا به این نقطه برسم که به شما توصیه کنم همچنان از بردار ها استفاده کنید! JIT دارای مشکلات زیادی است چرا که برنامه شما را در بسیاری از مواقع به صورت نادرستی بهینه می کند همچنین ناپایدار است و در نسخه های مختلف متلب نتایج متفاوتی به شما می دهد. از طرفی نوشتن برنامه با استفاده از بردار آن ها را ساده تر و نگهداری و بازنویسی کد ها را راحت تر می کند.
مایکل گلبارت مدرس دانشگاه بریتیش کلمبیا
@MatlabTips
#SpeedUp, #JIT
مترجم: (A-2)
(پیش نیاز: آشنایی مقدماتی با کدنویسی)
سطح پیچیدگی:🌕🌓🌑🌑🌑
چند سال پیش وقتی کمک درس MATLAB بودم در کلاس در مورد مزایای برداری سازی و دوری کردن از حلقه های for به شدت گرم صحبت بودم. سپس تصمیم گرفتم که به صورت زنده به دانشجویان نشان دهم که حرف هایم درست است، بنابراین تصمیم گرفتم برنامه ای مشابه برنامه زیر بنویسم:
N = 1e7;
tic
w = zeros(1, N);
for i = 1:N
w(i) = i*5;
end
fprintf('For loop: %.4fs\n', toc);
tic
y = (1:N)*5;
fprintf('Vectorized: %.4fs\n', toc);
این برنامه یک بردار از اعداد یک تا 10 میلیون را یک بار در حلقه for و دفعه بعدی به صورت برداری تک تک در 5 ضرب می کند. اما وقتی برنامه اجرا شد کاملا شوکه شدم چون حلقه سریع تر بود.(روی سیستم من الان)
For loop: 0.0923s
Vectorized: 0.1235s
بنابراین تصمیم گرفتم تغییرات دیگری در برنامه بدهم: مثلا تعداد را بیشتر کنم اما فایده ای نداشت. آنچه خوانده بودم انگار اشتباه بود. کم کم صدای خنده بچه ها بلند شده بود و من کاملا شرمنده شدم.
اما دلیل این اتفاق چه بود؟ چند سال پیش MATLAB یک قسمت به نام شتاب دهنده درجا (Just-In-Time(JIT) Accelerator) معرفی کرد. JIT در پشت صحنه اجرا می شود و بنابراین خیلی ها از آن خبر ندارند. وظیفه JIT آن است که کد های MATLAB را کامپایل می کند و دیگر به جای آن که خط به خط اجرا شود (چون MATLAB یک زبان مفسری است و به صورت پیش فرض باید خط به خط اجرا شود) قسمت هایی از کد را کامپایل کرده و در نهایت قسمت های کامپایل شده را اجرا می کند. حالا اگر به صورت دستی JIT را با دستور زیر خاموش کنیم:
feature('accel','off') %this line shuts down the JIT
N = 1e7;
tic
w = zeros(1, N);
for i = 1:N
w(i) = i*5;
end
fprintf('For loop: %.4fs\n', toc);
tic
y = (1:N)*5;
fprintf('Vectorized: %.4fs\n', toc);
نتایج به صورت زیر هستند:
For loop: 18.0181s
Vectorized: 0.1035s
همانطور که می بینید سرعت محاسبه برداری 174 برابر است.
تمام این ها را گفتم تا به این نقطه برسم که به شما توصیه کنم همچنان از بردار ها استفاده کنید! JIT دارای مشکلات زیادی است چرا که برنامه شما را در بسیاری از مواقع به صورت نادرستی بهینه می کند همچنین ناپایدار است و در نسخه های مختلف متلب نتایج متفاوتی به شما می دهد. از طرفی نوشتن برنامه با استفاده از بردار آن ها را ساده تر و نگهداری و بازنویسی کد ها را راحت تر می کند.
مایکل گلبارت مدرس دانشگاه بریتیش کلمبیا
@MatlabTips
#SpeedUp, #JIT
مترجم: (A-2)
🔵نگهداری در برابر عملکرد🔵
پیشنیاز: (پیشنیاز ندارد)
سطح پیچیدگی:🌒🌑🌑🌑🌑
گاهی اوقات فهم کدی که بهینهشده است (به لحاظ سرعت اجرا) دشوارتر است. برای مثال، کد mex (در پستهای بعدی توضیح داده خواهد شد) نسبت به معادل m-file خود پیچیدهتر است؛ گاهی اوقات برداریسازیهای پیچیده نسبت به حلقههای ساده فهم کد را دشوارتر کرده و برای اصلاح و نگهداری آن در آینده ممکن است دچار مشکل شوید.
شاید دوست داشته باشید که یک کد سریع بنویسید صرف نظر از اینکه چقدر آن کد نامرتب و پیچیده باشد. اما دقت کنید هزینهای که در آینده برای تصحیح احتمالی یک کد نامرتب میپردازم ممکن است نسبت به زمانی که در افزایش سرعت کد ذخیره کرده ایم بسیار سنگین باشد.
اثر کامنتها بر روی عملکرد کد "صفر" است و با این وجود بسیار ارزشمند هستند. موقع نوشتن کد براحتی میتوانید آنچه در ذهنتان میگذرد بصورت کامنت در کد خود وارد کنید. شاید سال بعد فراموش کنید که کدتان چگونه کار میکرده است ولی همچنان نیاز دارید که آن را اصلاح و خطایابی (debug) کنید. بنابراین لختی زمان بگذارید و کامنتهایی برای توصیف کد خود قرار دهید و حتی توضیح دهید که چرا از فلان الگوریتم استفاده شده است و ... .
سعی کنید به تمیزی و طراحی مناسب کد عادت کنید. 10 تا 20 برابر زمانی که صرف نوشتن و تایپ کردن کد میکنیم، صرف خواندن آن میکنیم. سعی کنید به جای آنکه کد سریعی داشته باشید، در وهله اول کد تمیزی داشته باشید. زمان یک برنامهنویس تقریبا در تمام موارد از زمان ماشین با ارزشتر است.
@MatlabTips
#SpeedUp, #performance
نویسنده:(A-1)
پیشنیاز: (پیشنیاز ندارد)
سطح پیچیدگی:🌒🌑🌑🌑🌑
گاهی اوقات فهم کدی که بهینهشده است (به لحاظ سرعت اجرا) دشوارتر است. برای مثال، کد mex (در پستهای بعدی توضیح داده خواهد شد) نسبت به معادل m-file خود پیچیدهتر است؛ گاهی اوقات برداریسازیهای پیچیده نسبت به حلقههای ساده فهم کد را دشوارتر کرده و برای اصلاح و نگهداری آن در آینده ممکن است دچار مشکل شوید.
شاید دوست داشته باشید که یک کد سریع بنویسید صرف نظر از اینکه چقدر آن کد نامرتب و پیچیده باشد. اما دقت کنید هزینهای که در آینده برای تصحیح احتمالی یک کد نامرتب میپردازم ممکن است نسبت به زمانی که در افزایش سرعت کد ذخیره کرده ایم بسیار سنگین باشد.
اثر کامنتها بر روی عملکرد کد "صفر" است و با این وجود بسیار ارزشمند هستند. موقع نوشتن کد براحتی میتوانید آنچه در ذهنتان میگذرد بصورت کامنت در کد خود وارد کنید. شاید سال بعد فراموش کنید که کدتان چگونه کار میکرده است ولی همچنان نیاز دارید که آن را اصلاح و خطایابی (debug) کنید. بنابراین لختی زمان بگذارید و کامنتهایی برای توصیف کد خود قرار دهید و حتی توضیح دهید که چرا از فلان الگوریتم استفاده شده است و ... .
سعی کنید به تمیزی و طراحی مناسب کد عادت کنید. 10 تا 20 برابر زمانی که صرف نوشتن و تایپ کردن کد میکنیم، صرف خواندن آن میکنیم. سعی کنید به جای آنکه کد سریعی داشته باشید، در وهله اول کد تمیزی داشته باشید. زمان یک برنامهنویس تقریبا در تمام موارد از زمان ماشین با ارزشتر است.
@MatlabTips
#SpeedUp, #performance
نویسنده:(A-1)
🔵توجه🔵
دوستان میخواستم یه نکته ای درباره ویدئوهای ارسالی خدمتتون عرض کنم. تا اطلاع ثانوی ویدئوهایی که ارسال خواهد شد به چهار بخش تقسیم میشن
1⃣متلب پیش مقدماتی (Pre Elementary)
2⃣متلب مقدماتی(Elementary)
3⃣متلب پیشرفته(Advanced)
4⃣پردازش تصویر(Image_processing)
دوستانی که دنبال متلب پیشرفته هستن نیازی نیست حجمشون رو صرف دانلود متلب پیش مقدماتی یا مقدماتی کنن. ولی دوستانی که تازه میخوان متلب یاد بگیرن، میتونن ویدئوهای پیشرفته هم دانلود کنند و یه گوشه آرشیو کنند تا بعدا بتونن از اونا استفاده کنن. درآینده ویدوئوهای بسیار جذاب و عملی در زمینه های مختلف برای تمام سطوح در کانال قرار میدیم.
ممنون که ما را دنبال میکنید.
@MatlabTips
#Caution
نویسنده: (A-1)
دوستان میخواستم یه نکته ای درباره ویدئوهای ارسالی خدمتتون عرض کنم. تا اطلاع ثانوی ویدئوهایی که ارسال خواهد شد به چهار بخش تقسیم میشن
1⃣متلب پیش مقدماتی (Pre Elementary)
2⃣متلب مقدماتی(Elementary)
3⃣متلب پیشرفته(Advanced)
4⃣پردازش تصویر(Image_processing)
دوستانی که دنبال متلب پیشرفته هستن نیازی نیست حجمشون رو صرف دانلود متلب پیش مقدماتی یا مقدماتی کنن. ولی دوستانی که تازه میخوان متلب یاد بگیرن، میتونن ویدئوهای پیشرفته هم دانلود کنند و یه گوشه آرشیو کنند تا بعدا بتونن از اونا استفاده کنن. درآینده ویدوئوهای بسیار جذاب و عملی در زمینه های مختلف برای تمام سطوح در کانال قرار میدیم.
ممنون که ما را دنبال میکنید.
@MatlabTips
#Caution
نویسنده: (A-1)
🔵جبر خطی را به MATLAB بیاورید🔵
پیشنیاز: مقدمات جبر خطی، مقدمات برنامه نویسی
سطح پیچیدگی:🌕🌑🌑🌑🌑
برای بسیاری از شما پیش آمده است که فرمولی در یک مقاله دیده اید و فهمیده اید(یا حتی نفهمیده اید) اما وقتی می خواهید آن را پیاده سازی کنید ایده ای ندارید. در نهایت با 5 یا 6 حلقه تو در تو برنامه را می نویسید که نه تنها فهم آن سخت است بلکه عیب یابی آن شما را به حد عصبانیت می رساند. مهم ترین دلیل این اتفاق این است که شما فرمول را به درستی به متلب وارد نکرده اید. متلب یک زبان برنامه نویسی مبتنی بر ماتریس هاست بنابراین شما هم باید از امکانات آن استفاده کنید. در غیر این صورت برنامه را با زبان های دیگر می نوشتید. در این سری قصد داریم کمی دقیق تر به متغیر های متلب نگاه کنیم و با مثال همه ی زوایای پنهان متغیرها که بسیار کاربردی هستند را روشن کنیم.
در ریاضی خوانده ایم که حداقل سه نوع متغیر داریم: اسکالر(یک متغیر تک)، بردار(سطری و ستونی) و ماتریس. در MATLAB هم دقیقا همین ها را داریم:
به طور کلی وقتی MATLAB بر روی موجودیت دوست داشتنی اش یعنی ماتریس عمل می کند بر روی همه ی اعضای آن عمل می کند و دقیقا همین باعث قدرتمند بودن آن می شود.
حالا حالت های مختلف ضرب را بررسی می کنیم: (در نماد گذاری زیر حروف a,b,c نشان دهنده اسکالر، x نشان دهنده بردار و X نشان دهنده ماتریس است. همچنین سمت چپ فلش نماد ریاضی و سمت راست سینتکس معادل در MATLAB را نشان می دهد)
1- ضرب یک اسکالر(یک متغیر عددی) در اسکالر، بردار و ماتریس:
پیشنیاز: مقدمات جبر خطی، مقدمات برنامه نویسی
سطح پیچیدگی:🌕🌑🌑🌑🌑
برای بسیاری از شما پیش آمده است که فرمولی در یک مقاله دیده اید و فهمیده اید(یا حتی نفهمیده اید) اما وقتی می خواهید آن را پیاده سازی کنید ایده ای ندارید. در نهایت با 5 یا 6 حلقه تو در تو برنامه را می نویسید که نه تنها فهم آن سخت است بلکه عیب یابی آن شما را به حد عصبانیت می رساند. مهم ترین دلیل این اتفاق این است که شما فرمول را به درستی به متلب وارد نکرده اید. متلب یک زبان برنامه نویسی مبتنی بر ماتریس هاست بنابراین شما هم باید از امکانات آن استفاده کنید. در غیر این صورت برنامه را با زبان های دیگر می نوشتید. در این سری قصد داریم کمی دقیق تر به متغیر های متلب نگاه کنیم و با مثال همه ی زوایای پنهان متغیرها که بسیار کاربردی هستند را روشن کنیم.
در ریاضی خوانده ایم که حداقل سه نوع متغیر داریم: اسکالر(یک متغیر تک)، بردار(سطری و ستونی) و ماتریس. در MATLAB هم دقیقا همین ها را داریم:
a=3%scalar
x=[1,2,3]% row vector
y=[1;2;3]% column vector
A=[1,2,3;4,5,6]% matrix
به طور کلی وقتی MATLAB بر روی موجودیت دوست داشتنی اش یعنی ماتریس عمل می کند بر روی همه ی اعضای آن عمل می کند و دقیقا همین باعث قدرتمند بودن آن می شود.
حالا حالت های مختلف ضرب را بررسی می کنیم: (در نماد گذاری زیر حروف a,b,c نشان دهنده اسکالر، x نشان دهنده بردار و X نشان دهنده ماتریس است. همچنین سمت چپ فلش نماد ریاضی و سمت راست سینتکس معادل در MATLAB را نشان می دهد)
1- ضرب یک اسکالر(یک متغیر عددی) در اسکالر، بردار و ماتریس:
برنامهMATLAB زیر یک نمونه از این حالات را به ترتیب نشان می دهد:
1- ضرب بردار در بردار: دو حالت ممکن برای ضرب دو بردار در هم وجود دارد. در حالت اول یک بردار ستونی(N*1) یعنی x در یک بردار سطری ( 1*M) یعنی y ضرب شده و نتیجه یک ماتریس است:
a = 3;
b = 4;
a * b %scalar by scalar
a = 3;
x = [1, 3, 7];
a * x %scalar by vector
a = 3;
X = [1, 2 ,4 ;5, 2, 3];
a * X %scalar by matrix
1- ضرب بردار در بردار: دو حالت ممکن برای ضرب دو بردار در هم وجود دارد. در حالت اول یک بردار ستونی(N*1) یعنی x در یک بردار سطری ( 1*M) یعنی y ضرب شده و نتیجه یک ماتریس است:
کد MATLAB زیر یک نمونه از این حالت را نشان می دهد:
3- ضرب ماتریس در بردار: اگر اندازه های ماتریس و بردار با هم سازگار باشد قابل ضرب کردن هستند. به طور مثال ماتریس N*M یعنی A در یک بردار ستونی M*1 یعنی x ضرب شده است و نتیجه یک بردار ستونی N*1 است:
x = [5, 2, 4];%row vector
y = [3; 1; 2];%column vector
x * y %dot product
y * x %produce a 3*3 matrix
3- ضرب ماتریس در بردار: اگر اندازه های ماتریس و بردار با هم سازگار باشد قابل ضرب کردن هستند. به طور مثال ماتریس N*M یعنی A در یک بردار ستونی M*1 یعنی x ضرب شده است و نتیجه یک بردار ستونی N*1 است:
کد MATLAB زیر یک مثال از این حالت را نشان می دهند:
4- ضرب ماتریس در ماتریس: در نهایت اگر اندازه های دو ماتریس با هم سازگار باشد قابل ضرب در هم هستند. به طور مثال دو ماتریس با اندازه های N*M و M*P به صورت زیر قابل ضرب در هم هستند:
A = [5, 2, 4; 2, 4, 5];%2*3 matrix
x = [4; 2; 3];%3*1 column vector
A * x %2*1 matrix
4- ضرب ماتریس در ماتریس: در نهایت اگر اندازه های دو ماتریس با هم سازگار باشد قابل ضرب در هم هستند. به طور مثال دو ماتریس با اندازه های N*M و M*P به صورت زیر قابل ضرب در هم هستند:
برنامه زیر یک نمونه را نشان می دهد:
عملیات بر روی ماتریس ها هم قدم مهمی در نوشتن فرمول های پیچیده است. اولین عمل، عمل های نقطه ای هستند. به آن ها نقطه ای گفته می شوند چراکه در MATLAB همراه با یک نقطه ظاهر می شوند. در این نوع عملیات ماتریس ها و بردار ها عنصر به عنصر بر روی هم عمل می کنند به طور مثال اگر بخواهیم دو بردار زیر به صورت عنصر به عنصر در هم ضرب شوند باید نوشت:
همچنین برای ضرب عنصر به عنصر دو ماتریس به صورت زیر عمل می کنیم:
توجه کنید به جای ضرب می توان عملیات دوتایی دیگر مانند توان(^)، تقسیم(/) هم استفاده کرد:
مورد دوم که ممکن است برای شما قدری عجیب تر باشد حالتی است که در آن یک عدد(اسکالر) به توان یک ماتریس(یا بردار) برسد. در این حالت نتیجه به صورت یک ماتریس(یا بردار) است که هر عضو آن آن عدد به توان عنصر متناظر در ماتریس اولیه است. برای فهم موضوع مثال زیر را در نظر بگیرید:
@MatlabTips
#Linear_algebra
نویسنده:(A-2)
A = [5, 2, 4; 2, 4, 5];%2*3 matrix
B = [3, 2, 9, 1; 1, 8, 8, 10; 2, 4, 3, 2];%3*4 matrix
A * B %2*4 matrix
عملیات بر روی ماتریس ها هم قدم مهمی در نوشتن فرمول های پیچیده است. اولین عمل، عمل های نقطه ای هستند. به آن ها نقطه ای گفته می شوند چراکه در MATLAB همراه با یک نقطه ظاهر می شوند. در این نوع عملیات ماتریس ها و بردار ها عنصر به عنصر بر روی هم عمل می کنند به طور مثال اگر بخواهیم دو بردار زیر به صورت عنصر به عنصر در هم ضرب شوند باید نوشت:
x = [5, 2, 4];
y = [3, 2, 9];
x .* y
همچنین برای ضرب عنصر به عنصر دو ماتریس به صورت زیر عمل می کنیم:
A = [5, 2, 4; 2, 4, 5];%2*3 matrix
B = [3, 2, 9; 1, 8, 8];%2*3 matrix
A .* B %3*3 matrix elementwise product
توجه کنید به جای ضرب می توان عملیات دوتایی دیگر مانند توان(^)، تقسیم(/) هم استفاده کرد:
A = [5, 2, 4; 2, 4, 5];%2*3 matrix
B = [3, 2, 9; 1, 8, 8];%2*3 matrix
A .^ B %3*3 matrix elementwise pow
مورد دوم که ممکن است برای شما قدری عجیب تر باشد حالتی است که در آن یک عدد(اسکالر) به توان یک ماتریس(یا بردار) برسد. در این حالت نتیجه به صورت یک ماتریس(یا بردار) است که هر عضو آن آن عدد به توان عنصر متناظر در ماتریس اولیه است. برای فهم موضوع مثال زیر را در نظر بگیرید:
a = 2; %scalar
X = [3, 2, 9; 1, 8, 8];%2*3 matrix
a .^ X %3*3 matrix
@MatlabTips
#Linear_algebra
نویسنده:(A-2)
🔵تاریخچهای کوتاه از MATLAB🔵
پیشنیاز: (پیشنیاز ندارد)
سطح پیچیدگی:🌒🌑🌑🌑🌑
نرم افزار MATLAB یک زبان برنامهنویسی سطح بالا و یک محیط محاسباتی برای مسائل مهندسی و ریاضی است. شالوده و ایده اصلی این نرمافزار برای اولین بار توسط آقای کلو مولر (Cleve Moler) در اواخر 1970 شکل گرفت که با هدف دسترسی به پکیجهای نرمافزاری جبرخطی در فورترن (Fortran) بود. نام این نرمافزار تلفیق MATrix LABoratory میباشد که از جبر خطی منشا یافته است. از آن زمان به بعد MATLAB به عنوان یک ابزار فوقالعاده برای تست و پیادهسازی ایدههای جدید استفاده میشود. این نرمافزار دارای قابلیتهای بینظیر گرافیکی است و نحو (syntax) آن بسادگی قابل درک است. البته قابلیتهای دیگری چون ODE-solvers، دیالوگ باکسها و دستوراتی برای ساخت GUI(بخوانید "گویی") نیز دارد که کمتر متداول است. همچنین با استفاده از این نرم افزار قادر خواهید بود دستورات به زبان C یا Fortran بنویسید که MATLAB می تواند آن را تفسیر (interpret)کند. برای فهمیدن تمام این ویژگیها ابتدا لازم است که یک آشنایی مقدماتی با دستورات ابتدایی MATLAB داشته باشید.
@MatlabTips
#History
نویسنده : (A-1)
پیشنیاز: (پیشنیاز ندارد)
سطح پیچیدگی:🌒🌑🌑🌑🌑
نرم افزار MATLAB یک زبان برنامهنویسی سطح بالا و یک محیط محاسباتی برای مسائل مهندسی و ریاضی است. شالوده و ایده اصلی این نرمافزار برای اولین بار توسط آقای کلو مولر (Cleve Moler) در اواخر 1970 شکل گرفت که با هدف دسترسی به پکیجهای نرمافزاری جبرخطی در فورترن (Fortran) بود. نام این نرمافزار تلفیق MATrix LABoratory میباشد که از جبر خطی منشا یافته است. از آن زمان به بعد MATLAB به عنوان یک ابزار فوقالعاده برای تست و پیادهسازی ایدههای جدید استفاده میشود. این نرمافزار دارای قابلیتهای بینظیر گرافیکی است و نحو (syntax) آن بسادگی قابل درک است. البته قابلیتهای دیگری چون ODE-solvers، دیالوگ باکسها و دستوراتی برای ساخت GUI(بخوانید "گویی") نیز دارد که کمتر متداول است. همچنین با استفاده از این نرم افزار قادر خواهید بود دستورات به زبان C یا Fortran بنویسید که MATLAB می تواند آن را تفسیر (interpret)کند. برای فهمیدن تمام این ویژگیها ابتدا لازم است که یک آشنایی مقدماتی با دستورات ابتدایی MATLAB داشته باشید.
@MatlabTips
#History
نویسنده : (A-1)
🔵توجه🔵
ممکن است پیامهای متنی که در کانال گذاشته میشود بر روی گوشیهای شما دچار اشکال شود و کلمات انلگیسی و فارسی جابه جا شوند. در اینصورت سعی کنید از روی لپتاپ یا کامپیوتر رومیزی خود استفاده کنید.
@MatlabTips
#Caution
نویسنده : (A-1)
ممکن است پیامهای متنی که در کانال گذاشته میشود بر روی گوشیهای شما دچار اشکال شود و کلمات انلگیسی و فارسی جابه جا شوند. در اینصورت سعی کنید از روی لپتاپ یا کامپیوتر رومیزی خود استفاده کنید.
@MatlabTips
#Caution
نویسنده : (A-1)
بازی زندگی (game of life)
پیش نیاز:( آشنایی مقدماتی با برنامه نویسی متلب)
سطح پیچیدگی: 🌕🌕🌑🌑🌑
"بازی زندگی" یک مدل ریاضی است که توسط جان کانوی ریاضیدان بریتانیایی اختراع شده است. بازی زندگی یک بازی است که بازیگری ندارد و شرایط آن را وضعیت اولیه مهره ها تعیین می کنند.
جهان در بازی زندگی یک صفحه مشبک دو بعدی است و موجودات این جهان خانه هایی اند که سیاه رنگ اند. زمان این جهان گسسته است و هر نسل از نسل قبل به وجود می آید. در هر قدم سرنوشت هر فرد توسط افراد دور و برش تعیین می شود. تنها 4 قاعده ساده زیر بر این جهان حکمفرماست:
1- هر سلول زنده اگر کمتر از دو نفر در اطرافش باشد از تنهایی میمیرد!
2- هر سلول زنده اگر دو یا سه نفر اطرافش باشد به نسل بعد منتقل می شود.
3- اگر سلول زنده ای بیشتر از 3 نفر در اطرافش باشد از کمبود امکانات و جمعیت زیاد می میرد!
4- هر سلول با دقیقا 3 نفر در اطرافش یک سلول جدید را بوجود می آورد: تولید نسل جدید!
شاید این قواعد ساده به نظر برسد اما همین قوانین به ظاهر ساده الگو های عجیبی را به نمایش می گذارند. پیچیدگی رفتار این سلول ها به حدی زیاد است که بسیاری از باور های پذیرفته شده علمی را به زیر سوال می برد. مهمترین اصلی که بسیار شهودی هم به نظر می رسد وجود یک ناظم یا مدیر برای ایجاد و نگهداری رفتار های پیچیده است. در بازی زندگی پیچیدگی به صورت خود سازمانده(self organized) از درون سادگی به وجود می آید و فرگشت می یابد. دنیل دنت فیلسوف و متخصص علوم شناختی "بازی زندگی" را مثالی از ایجاد ساخت های پیچیده مانند "آگاهی" و "اراده آزاد"(اختیار) از قوانین نسبتا ساده فیزیکی و اندر کنش آن ها به هم می داند.
حالا چگونه این برنامه را پیاده سازی کنیم. اولین نکته آن است که می توان چهار قاعده بالا را به یک قاعده زیر ساده کرد:
"یک سلول زنده با دو همسایه زنده، یا هر سلولی با سه همسایه زنده و در نسل بعد زنده است و در غیر این صورت زنده نیست"
این جمله را می توان به صورت زیر برنامه نویسی کرد:
( به نحوه ی ارتباط آن ها فکر کنید!)
که در آن GRID همان مشبک جهان ماست و neighbours همسایه های هر خانه است.
این بازی به قدری ساده است که شما به راحتی می توانید آن را پیاده سازی کنید. در زیر یک نمونه از برنامه برای بازی زندگی را می بینید:
خود متلب هم به صورت آماده این برنامه را پیاده سازی کرده است که با زدن life در خط فرمان می توانید آن را ببینید.(در easter egg های آن)
هر اجرای برنامه یک جهان می سازد. این جهان با تعدادی سلول(افراد) به صورت تصادفی آغاز می شود و ادامه می یابد: سلول ها با هم ترکیب شده و فرزندان جدیدی بوجود می آورند. برخی از قحطی از بین می روند و برخی از آن ها شروع به "مهاجرت" می کنند. الگوهای زیادی در بازی زندگی کشف شده اند. یکی از جالب ترین آن ها الگوی جنگ و فرار است که در آن دو طرف به سمت هم شلیک کرده و تعدادی از سلول ها به صورت زیر فرار می کنند. شکل زیر این الگو را نشان می دهد:
#Game_of_life
#Easter_egg
نویسنده: (A-2)
پیش نیاز:( آشنایی مقدماتی با برنامه نویسی متلب)
سطح پیچیدگی: 🌕🌕🌑🌑🌑
"بازی زندگی" یک مدل ریاضی است که توسط جان کانوی ریاضیدان بریتانیایی اختراع شده است. بازی زندگی یک بازی است که بازیگری ندارد و شرایط آن را وضعیت اولیه مهره ها تعیین می کنند.
جهان در بازی زندگی یک صفحه مشبک دو بعدی است و موجودات این جهان خانه هایی اند که سیاه رنگ اند. زمان این جهان گسسته است و هر نسل از نسل قبل به وجود می آید. در هر قدم سرنوشت هر فرد توسط افراد دور و برش تعیین می شود. تنها 4 قاعده ساده زیر بر این جهان حکمفرماست:
1- هر سلول زنده اگر کمتر از دو نفر در اطرافش باشد از تنهایی میمیرد!
2- هر سلول زنده اگر دو یا سه نفر اطرافش باشد به نسل بعد منتقل می شود.
3- اگر سلول زنده ای بیشتر از 3 نفر در اطرافش باشد از کمبود امکانات و جمعیت زیاد می میرد!
4- هر سلول با دقیقا 3 نفر در اطرافش یک سلول جدید را بوجود می آورد: تولید نسل جدید!
شاید این قواعد ساده به نظر برسد اما همین قوانین به ظاهر ساده الگو های عجیبی را به نمایش می گذارند. پیچیدگی رفتار این سلول ها به حدی زیاد است که بسیاری از باور های پذیرفته شده علمی را به زیر سوال می برد. مهمترین اصلی که بسیار شهودی هم به نظر می رسد وجود یک ناظم یا مدیر برای ایجاد و نگهداری رفتار های پیچیده است. در بازی زندگی پیچیدگی به صورت خود سازمانده(self organized) از درون سادگی به وجود می آید و فرگشت می یابد. دنیل دنت فیلسوف و متخصص علوم شناختی "بازی زندگی" را مثالی از ایجاد ساخت های پیچیده مانند "آگاهی" و "اراده آزاد"(اختیار) از قوانین نسبتا ساده فیزیکی و اندر کنش آن ها به هم می داند.
حالا چگونه این برنامه را پیاده سازی کنیم. اولین نکته آن است که می توان چهار قاعده بالا را به یک قاعده زیر ساده کرد:
"یک سلول زنده با دو همسایه زنده، یا هر سلولی با سه همسایه زنده و در نسل بعد زنده است و در غیر این صورت زنده نیست"
این جمله را می توان به صورت زیر برنامه نویسی کرد:
GRID = neighbours==3 | GRID & neighbours==2;
( به نحوه ی ارتباط آن ها فکر کنید!)
که در آن GRID همان مشبک جهان ماست و neighbours همسایه های هر خانه است.
این بازی به قدری ساده است که شما به راحتی می توانید آن را پیاده سازی کنید. در زیر یک نمونه از برنامه برای بازی زندگی را می بینید:
len = 300;%size of the world
GRID = int8(rand(len,len));
up = [2:len 1];
down = [len 1:len-1]; %the world is round
colormap([0,0,0;0,1,0]);
for i=1:100
neighbours = GRID(up,:) + GRID(down,:) + GRID(:,up) + GRID(:,down) ...
+ GRID(up,up) + GRID(up,down) + GRID(down,up) + GRID(down,down);
GRID = neighbours==3 | GRID & neighbours==2;
image(GRID*30);
pause(0.02);
end
خود متلب هم به صورت آماده این برنامه را پیاده سازی کرده است که با زدن life در خط فرمان می توانید آن را ببینید.(در easter egg های آن)
هر اجرای برنامه یک جهان می سازد. این جهان با تعدادی سلول(افراد) به صورت تصادفی آغاز می شود و ادامه می یابد: سلول ها با هم ترکیب شده و فرزندان جدیدی بوجود می آورند. برخی از قحطی از بین می روند و برخی از آن ها شروع به "مهاجرت" می کنند. الگوهای زیادی در بازی زندگی کشف شده اند. یکی از جالب ترین آن ها الگوی جنگ و فرار است که در آن دو طرف به سمت هم شلیک کرده و تعدادی از سلول ها به صورت زیر فرار می کنند. شکل زیر این الگو را نشان می دهد:
#Game_of_life
#Easter_egg
نویسنده: (A-2)