راهنمای نوشتن و کار با 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 را به توابع دیگر در متلب بدهید. برای این کار لازم هست بلد باشید با چه دستوری یک متغیر یا پارامتر را به عنوان ورودی دریافت کنید و با چه دستوری خروجی را به توابع دیگر ارسال کنید. در لینک زیر با همه این دستورات آشنا میشید. (نیاز به ف ی ل ت ر ش ک ن)
http://www.shawnlankton.com/2008/03/…hort-tutorial/
راه خیلی ساده تری هم وجود دارد, اینکه از طریق برنامه متلب خیلی راحت کد نوشته شده را تبدیل به Mex file کنید و راحت آن را اجرا کنید. تقریبا بدون هیچ دردسری! در ویدئویی که لینکش رو می زارم خیلی راحت میتونید این کارو انجام بدید. تنها با دیدن چند دقیقه ابتدایی و چند دقیقه انتهایی میتونید کد متلب رو به Mex File تبدیل کنید. (نیاز به ف ی ل ت ر ش ک ن)
http://www.youtube.com/watch?v=IZJ-IlI3QR0
استفاده از Mex File به طور چشمگیری سرعت اجرای برنامه را بالا می برد. در تجربه من زمان اجرای یک برنامه را از 7 دقیقه به 4 ثانیه، همان مسئله در ابعاد بزرگتر از 45 دقیقه به 9 ثانیه (!) کاهش داد و باز همان مسئله در ابعاد خیلی بزرگتر که قبل از استفاده از Mex File بعد از 5 ساعت به هیچ جوابی نرسیده بودم بعد از استفاده از Mex File ، بعد از 45 دقیقه به جواب آخر رسیدم

شاید علاقه مند باشید مطالب زیر را هم ببینید:

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

برای امنیت، استفاده از سرویس reCAPTCHA گوگل مورد نیاز است که موضوع گوگل است Privacy Policy and Terms of Use.

اگر با این شرایط موافقید، لطفا here کلیک کنید.