نوشتن و کار با فایل MEX. در متلب توسط زبان ++C
راهنمای نوشتن و کار با MEX. در متلب (MATLAB) توسط زبان برنامه نویس ++C
شاید برای شما سوال بوجود آمده باشد که چرا باید از فایل mex در متلب استفاده کنیم. یکی از مزیت های مهم این کار بخاطر افزایش سرعت اجرای برنامه متلب است. MATLAB یک زبان ترجمه شده (interpreted) ست که در اون هر عملیات نیاز به پردازش اضافی داره. در زبانهای تفسیر شده مثل C یا C++ این زمان اضافی رو نداریم. MATLAB دارای مکانیزم ایجاد کد بصورت لحظه ای و فوری هست که این مشکل را در مواردی کاهش میده.
تعریف (Nomenclature): کامپایلر (Compiler)، متلب (MATLABTM)،
کنسول (Console, MATLAB Command Window )، فایل ساده (eg: hello.cpp )
قبل از هر اقدامی، از وجود کامپایلر C++ در کامپیوتر خود مطمئن شوید. این کار با اجرای یک فایل ساده قابل آزمایش است. در غیر اینصورت نرم افزار Visual Studio 2012 Ultimate را بطور کامل نصب کنید. این نرمافزار شامل کامپایلر مذکور میباشد.
- فایل ساده (hello.cpp) را در مسیر متلب قرار دهید.
- با دستور
>> mex -setup
کامپایلر مورد نظر را به عنوان کامپایلر پیشفرض در متلب تعریف کنید. بعد از تایپ این دستور، ملاحظه خواهید فرمود:
Welcome to mex -setup. This utility will help you set up
a default compiler. For a list of supported compilers, see
http://www.mathworks.com/support/compilers/R2011a/win32.html
Please choose your compiler for building MEX-files:
Would you like mex to locate installed compilers [y]/n?
پاسخ دهید: Yes با تایپ y
Would you like mex to locate installed compilers [y]/n?y
خواهید دید:
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2011a\sys\lcc
[0] None
Compiler:
انتخاب کنید: 1
Compiler: 1
مجددا تایید کنید:
Please verify your choices:
Compiler: Lcc-win32 C 2.4.1
Location: D:\PROGRA~1\MATLAB\R2011a\sys\lcc
Are these correct [y]/n? 1
- اکنون زمان کامپایل کردن فایل ساده (hello.cpp) با دستور زیر است:
>> mex hello.cpp
توجه داشته باشید که انتخاب زیر، نسبت به انتخاب فوق، دارای استقلال نسبت به سیستمهای نصب شده در کامپیوتر شما میباشد (Independent from the Platform):
>> mex -win32 hello.cpp
- بعد از کامپایل شدن، فایل اخیر را به مانند یک فایل معمولی متلب در کنسول متلب، اجرا کنید.
>> hello
Hello, world!
مثالهای آماده در متلب در دایرکتوری extern/examples/mex/ موجود است که میتوان حتی آنرا با دستور زیر، ادیت و اصلاح نمود:
>> edit([matlabroot ‘/extern/examples/mex/explore.c’])
کد ساده (hello.cpp)
% hello.cpp
#include “mex.h” /* Always include this */
void mexFunction(int nlhs, mxArray *plhs[], /* Output variables */
int nrhs, const mxArray *prhs[]) /* Input variables */
{
mexPrintf(“Hello, world!\n”); /* Do something interesting */
return;
}
خب توضیحات بالا یک مثال عامیانه و مبتدی در این زمینه بود
حالا دقیق تر به این مورد می پردازیم.
همانطور که می دانید سرعت اجرای حلقه ها و دستورات کنترلی در متلب پایین است. سه روش برای بهبود سرعت پردازش ها وجود دارد: preallocation، بردارسازی و استفاده از توابعی به نام MEX File
پیش تعریف کردن آرایه ها و بردارسازی برنامه که نیازی به توضیح زیادی ندارد و کسانی که با زبان متلب آشنایی داشته باشند می توانند به راحتی آن را پیاده سازی کنند.
و اما MEX Fileها. در برخی شرایط که استفاده از بردارسازی ممکن نباشد یا حتی استفاده از آن، سرعت اجرای برنامه را به دلیل افزایش کاربرد حافظه کاهش بدهد, در این شرایط باید حلقهها و توابع را تبدیل به فایلهای MEX نمود. فایلهای MEX مانند توابع داخلی MATLAB، فایلهای کامپایل شده هستند. بنابراین بسیار سریع هستند. کار با توابعی که بصورت فایل MEX در آمدهاند بسیار ساده است. این توابع مانند دیگر توابع میتوانند بطور مستقیم توسط MATLAB فراخوانده بشوند. در MATLAB با کاربرد دستور mex ، فایلهای MEX مبتنی بر C یا Fortran ایجاد کرد.
برای اجرای فایل های MEX نیاز هست که ابتدا کامپایلر آن را با کپی دستور زیر در Command window نصب نمود.
1
|
mex -setup |
اما قبل از آن لازم هست ابتدا ++visual C را به همراه windows sdk نصب کنید. در صورتی که نصب windows sdk با مشکل مواجه شد ابتدا از کنترل پنل این دو برنامه را حذف کنید:
Microsoft Visual C++ 2010 x86 Redistributable
Microsoft Visual C++ 2010 x64 Redistributable
بعد windows SDKs رو می شود نصب کرد. بعد از آن نصب کامپایلر Mex با کدی که در بالا نوشته شده. همینطور بعد از آن می شود دوباره ورژن جدید ++C نصب کرد و به تنظیمات قبل برگشت.
حالا نوبت نوشتن و یا تبدیل کد متلب به کد زبان C یا C++ است. به دو طریق می توان Mex File رو ایجاد کرد. روش اول به این صورت است که با استفاده از محیط متلب و یا C++ تابعی که در واقع گلوگاه برنامه ما و زمانبر هست رو خودمان به صورت دستی بنویسیم که این کار نیاز به آشنایی به سینتکس های زبان C یا C++ دارد که با توجه به اینکه زبان متلب شبیه این دو زبان هست کار سختی نیست. مشکل این روش خطایابی آن هست که کمی پیچیده است. با Mex File می توانید از توابع دیگر در متلب ورودی دریافت کنید و یا خروجی Mex File را به توابع دیگر در متلب بدهید. برای این کار لازم هست بلد باشید با چه دستوری یک متغیر یا پارامتر را به عنوان ورودی دریافت کنید و با چه دستوری خروجی را به توابع دیگر ارسال کنید.
راه خیلی ساده تری هم وجود دارد, اینکه از طریق برنامه متلب خیلی راحت کد نوشته شده را تبدیل به Mex file کنید و راحت آن را اجرا کنید. تقریبا بدون هیچ دردسری! در ویدئویی که لینکش رو می زارم خیلی راحت میتونید این کارو انجام بدید. تنها با دیدن چند دقیقه ابتدایی و چند دقیقه انتهایی میتونید کد متلب رو به Mex File تبدیل کنید. (نیاز به ف ی ل ت ر ش ک ن)
http://www.youtube.com/watch?v=IZJ-IlI3QR0
استفاده از Mex File به طور چشمگیری سرعت اجرای برنامه را بالا می برد. در تجربه من زمان اجرای یک برنامه را از 7 دقیقه به 4 ثانیه، همان مسئله در ابعاد بزرگتر از 45 دقیقه به 9 ثانیه (!) کاهش داد و باز همان مسئله در ابعاد خیلی بزرگتر که قبل از استفاده از Mex File بعد از 5 ساعت به هیچ جوابی نرسیده بودم بعد از استفاده از Mex File ، بعد از 45 دقیقه به جواب آخر رسیدم
شاید علاقه مند باشید مطالب زیر را هم ببینید:
- شناسایی توابع انتقال ماشین DCبا استفاده از پاسخ پله به کمک الگوریتم ژنتیک
- سفارش شبیه سازی مقالات درس کنترل مدرن با متلب
- بدست آوردن تقریب سری تیلور مرتبه دوم با متلب
- دستور demo در متلب
- مدل فرایند گاورنر 4درجه آزادی جهت کنترل سرعت توربین
- شناسایی سیستم غیر خطی ربات بازوی مسطح دو درجه آزادی توسط شبکه عصبی
- ماشین های القایی متقارن در متلب قسمت دوم
- سفارش شبیه سازی مقالات درس شناسایی سیستم با متلب
- بررسی شرط پیوستگی جریان در یکسوساز نیم موج کنترل شده با متلب
سلام این موردی که توضیح دادین فوقالعاده هست. فقط یه مشکلی وجودداره اون فایل یوتیوب که قرار دادین بنظر private هست. اگر امکانش باشه ویدیوش رو هم تو سایتتون قرار بدین عالی میشه. متشکراز توضیح روشنتون.