MATLAB به زبان C++ صحبت می کند
سلام به همه! امروز میخواهم یک وبلاگنویس مهمان، Vivek Bhownani را معرفی کنم، که توسعهدهنده اصلی یک ویژگی جدید هیجانانگیز در R2019a است که دسترسی آسان به کتابخانههای C++ را بدون نوشتن هیچ کد C++ باز میکند.
آیا کتابخانه ++C وجود دارد که از آن در متلب استفاده کنید یا می خواهید از آن استفاده کنید؟ ما همیشه درخواستهایی را از کاربرانی میشنویم که به دنبال تماس با کتابخانههای C++ هستند که موضوعاتی از یادگیری ماشین تا توسعه بازی را در بر میگیرد. OpenCV، Tensorflow و LibXL چند نمونه هستند.
انجام پروژه متلب با بهترین متخصصان در فریلنس پروژه
بسته بندی یک کتابخانه ++C برای استفاده از یک محیط خارجی می تواند یک کار بسیار وقت گیر باشد که نیاز به کار توسعه ای زیادی دارد. هدف ما این است که شما را قادر کنیم بدون نوشتن کد C++ با C++ ارتباط بگیرید و به طور بالقوه روزهای کاری را برای بسته بندی یک کتابخانه به چند ساعت کاهش دهید.
متلب چندین سال است که امکان فراخوانی این کتابخانه ها را با قرار دادن آنها در رابط های C و استفاده از LOADLIBRARY فراهم کرده است. متلب همچنین رابط MEX را ارائه کرده است که به شما امکان می دهد یک فایل بسته بندی متلب برای فراخوانی عملکرد C یا C++ بنویسید. با این حال، هر گزینه محدودیت های خود را دارد و هیچ یک راه مستقیم برای فراخوانی C++ از MATLAB ارائه نمی دهد. به همین دلیل است که من در مورد قابلیت های جدید R2019a هیجان زده هستم که به شما کمک می کند با کتابخانه های C++ از MATLAB تماس بگیرید. متلب اکنون به زبان C++ صحبت می کند!
شخصیت های کاربری ما:
MATLAB به زبان C++
من می خواهم از طریق این پست با دو نوع کاربر مختلف ارتباط برقرار کنم. اگر به دنبال ایجاد یک کتابخانه C++ خاص برای تماس در MATLAB هستید، شما ناشر یک کتابخانه هستید. اگر به دنبال تماس ساده با کتابخانه از طریق رابط منتشر شده آن هستید، کاربر نهایی هستید.
برای تماس با C++ نیازی به دانستن C++ نیست
MATLAB به زبان C++
ما می خواهیم به ناشران کمک کنیم تا بر روی ساخت برنامه های کاربردی بر اساس کتابخانه های ++C شما تمرکز کنند. در واقع، شما حتی نیازی به دانستن C++ ندارید. آن را به ما بسپار
SWIG ابزاری است که راهی برای انتشار رابطهای wrapper برای کتابخانههای C++ فراهم میکند که میتوان از محیطهایی مانند پایتون و جاوا استفاده کرد. اما کاربران باید کد رابط SWIG ویژه ای بنویسند که باید آن را یاد بگیرند و حفظ کنند. برخلاف SWIG، MATLAB سعی می کند یک فایل تعریف رابط برای شما ایجاد کند. سپس میتوانید این فایل را در بلوکهای تعیینشده ویرایش کنید تا رابط را مطابق با نیازهای خود تنظیم کنید. شما نیازی به یادگیری روش خاصی برای کدنویسی ندارید.
به عنوان یک کاربر نهایی، ممکن است نیازی به ایجاد فایل رابط نداشته باشید – شاید کسی برای شما بنویسد.
ما برخی از شما را تشویق می کنیم که به عنوان ناشر عمل کنید و این فایل های رابط را برای کتابخانه هایی که می خواهید با کاربران نهایی به اشتراک بگذارید ایجاد کنید. شما ممکن است توسعهدهندهای باشید که کتابخانه C++ را نوشته است و میخواهید به مخاطبان بیشتری دسترسی داشته باشید. یا شاید شرکت شما درایورهایی را برای سخت افزاری ارائه می دهد که می تواند با متلب استفاده شود. ناشران دیگر ممکن است به سادگی بخواهند کار خود را به اشتراک بگذارند تا به سایر کاربران کمک کنند با کتابخانه C++ که شما تماس میگیرید تماس بگیرند. به عنوان یک ناشر، به یک کامپایلر C++ سازگار نیاز دارید. اگر کاربر نهایی هستید، برای فراخوانی کتابخانه نیازی به کامپایلر C++ ندارید.
بیایید به فراخوانی کلاس C++ که نوشتم نگاه کنیم
من چند کلاس در C++ برای مثال Car with Engine ایجاد کردم:
class Engine { private: int fNumberOfCylinders; public: Engine(int numcylinders) : fNumberOfCylinders(numcylinders), isServiced(false) {} int getNumCylinders() const { return fNumberOfCylinders; } bool isServiced; }; class Car { private: Engine& fEngine; public: Car(Engine &engine): fEngine(engine) {} Engine& getEngine() { return fEngine; } };
ساخت رابط
از آنجایی که این کتابخانه فقط یک فایل هدر است، میتوانیم یک ساخت مستقیم با استفاده از تابع زیر انجام دهیم:
clibgen.generateLibraryDefinition("auto.h"); build(defineauto);Warning: Only header files specified; assuming this is a header-only library. If library files also need to be specified, use the 'Libraries' option. Warning: File 'manifest.json' not found. Using Microsoft Visual C++ 2015 compiler. Generated definition file 'C:\BlogPost\defineauto.mlx' and data file 'C:\BlogPost\autoData.xml' contain definitions for 9 constructs supported by MATLAB. Build using build(defineauto). Building interface file 'autoInterface.dll'. Interface file 'autoInterface.dll' built in folder 'C:\BlogPost\auto'. To use the library, add the interface file folder to the MATLAB path.
clibgen.generateLibraryDefinition(“auto.h”);
build(defineauto);هشدار: فقط فایل های هدر مشخص شده است. با فرض اینکه این یک کتابخانه فقط هدر است. اگر
فایل های کتابخانه نیز باید مشخص شوند، از گزینه “کتابخانه ها” استفاده کنید.
هشدار: فایل ‘manifest.json’ یافت نشد.
با استفاده از کامپایلر Microsoft Visual C++ 2015.
فایل تعریف تولید شده ‘C:\BlogPost\defineauto.mlx’ و فایل داده ‘C:\BlogPost\autoData.xml’ حاوی تعاریفی برای 9 ساختار پشتیبانی شده توسط MATLAB هستند.
ساخت با استفاده از build (defineauto).
ساخت فایل رابط «autoInterface.dll».
فایل رابط «autoInterface.dll» در پوشه «C:\BlogPost\auto» ساخته شده است.
برای استفاده از کتابخانه، پوشه فایل رابط را به مسیر MATLAB اضافه کنید.
می توانید با خیال راحت هشدار ایجاد شده در این مورد را نادیده بگیرید. ما هشداری صادر میکنیم تا به کاربران یادآوری کنیم که فرض میکنیم این یک کتابخانه فقط سرصفحهای است، و اگر دقیق نباشد، باید از گزینه «کتابخانهها» برای ارائه کتابخانه استفاده شود. فراموش نکنید که پوشه تولید شده “auto” (که حاوی رابط تولید شده است) را به مسیر MATLAB اضافه کنید.
addpath('auto');
تمام است، ما اکنون آماده ایم که این کتابخانه را از MATLAB فراخوانی کنیم
بیایید ابتدا یک ماشین با موتور بسازیم
eng = clib.auto.Engine(4); car = clib.auto.Car(eng); car.getEngine.isServicedans = logical 0
حالا بیایید موتور را سرویس کنیم و دوباره ماشین را بررسی کنیم:
eng.isServiced = true; car.getEngine.isServicedans = logical 1
MATLAB دسته هایی را برای نمایش اشیاء C++ ایجاد می کند. همانطور که در بالا می بینید، “eng” به این اشاره دارد
موتور داخل ماشین (شئی که با روش “getEngine” در کلاس “car” برگردانده می شود). با این حال، نمی توان از آن برای از بین بردن موتور داخل خودرو استفاده کرد، یعنی خودرو همچنان مالک موتور خود است. وقتی روی موتور با delete تماس می گیریم توجه کنید.
delete(eng) engeng = handle to deleted Enginecar.getEngine % The car (with its engine) is still intact.ans = Engine with properties: isServiced: 1
اکنون به یک مثال رمزگذاری نگاه می کنیم
در اینجا یک قطعه کد C++ وجود دارد که یک الگوریتم رمزگذاری را در کتابخانه SpaceCrypto فراخوانی میکند تا رشته «سلام جهان!» را رمزگذاری کند. و سپس رمزگشایی را فراخوانی می کند تا رشته اصلی را برگرداند.
#include <iostream> #include "cryptopp_wrapper.h" using namespace std; int main() { // Call Encryption cout<<"Space Wrapper TEST!"<<endl<<endl; SpaceCrypto::CryptBlowFish hello; hello.setPlainString("HelloWorld!"); hello.setKey("mySecUreKey!!"); std::string crypt; crypt = hello.Encrypt(); // Call Decryption cout<<"Plain Text: HelloWorld!"<<endl; cout<<"Crypt Text: "<<crypt<<endl; hello.reset(); hello.setEncString(crypt); hello.setInputMode(SpaceCrypto::HEX); hello.setKey("mySecUreKey!!"); hello.setOutputMode(SpaceCrypto::NORMAL); cout<<"Decry Text: "<<hello.Decrypt()<<endl; }
ساخت رابط
در اینجا ما باید کمی بیشتر از مثال قبلی کار کنیم، اما هنوز نیازی به نوشتن کد ++C نداریم. ما یک راه جایگزین برای ساخت رابط داریم که یک فرآیند چند مرحلهای است – تولید فایل تعریف، ارائه تعاریف و سپس ساخت.
تنظیم محیط
loc = 'cryptopp700'; dllLoc = fullfile(loc, 'x64\DLL_Output\Release'); path = getenv('PATH'); setenv('PATH', [dllLoc ';' path]);
ایجاد تعریف
headerFiles = "cryptopp_wrapper.h"; includePath = loc; outputFolder = pwd; libraries = [fullfile(loc, "x64\DLL_Output\Release\cryptopp.lib"), ... fullfile(loc, "x64\DLL_Output\Release\cryptlib.lib")]; clibgen.generateLibraryDefinition(headerFiles, "IncludePath", includePath, ... 'Libraries', libraries, 'OutputFolder', outputFolder, 'PackageName', 'crypto', 'verbose', true);Warning: Some C++ language constructs in the header file are not supported and not imported. Using Microsoft Visual C++ 2015 compiler. Generated definition file 'C:\BlogPost\definecrypto.mlx' and data file 'C:\BlogPost\cryptoData.xml' contain definitions for 20 constructs supported by MATLAB. 4 constructs require additional definition. To include these constructs in the interface, edit the definitions in 'C:\BlogPost\definecrypto.mlx'. Build using build(definecrypto).
(( ‘کتابخانه ها’، کتابخانه ها، ‘OutputFolder’، outputFolder، ‘PackageName’، ‘crypto’، ‘verbose’، true)؛ هشدار: برخی از ساختارهای زبان C++ در فایل هدر پشتیبانی نمی شوند و
وارداتی نیست
با استفاده از کامپایلر Microsoft Visual C++ 2015.
فایل تعریف تولید شده ‘C:\BlogPost\definecrypto.mlx’ و فایل داده ‘C:\BlogPost\cryptoData.xml’ حاوی تعاریفی برای 20 ساختار پشتیبانی شده توسط MATLAB هستند.
4 ساختار نیاز به تعریف اضافی دارند. برای گنجاندن این ساختارها در رابط، تعاریف را در ‘C:\BlogPost\definecrypto.mlx’ ویرایش کنید.
ساخت با استفاده از build (definecrypto).
مرحله بالا فایل تعریف را تولید می کند. این همه کلاس ها، توابع، enum ها و غیره را که در فایل هدر می خوانیم لیست می کند. ))
فایل تعریف… چرا به آن نیاز دارم؟
MATLAB به زبان C++
بیشتر گردش کار در ساخت رابط C++ خودکار است. MATLAB فایلهای هدر ارائه شده را میخواند و یک کتابخانه رابط ایجاد میکند که راهی برای فراخوانی هر تابع/کلاس در کتابخانه فراهم میکند. با این حال، مواردی وجود دارد که نمیتوانیم به طور خودکار چنین عملکردی را فراخوانی کنیم، و به ناشران نیاز داریم تا در تعیین «نحوه فراخوانی» چنین توابعی کمک کنند (برای مثال اینجا را کلیک کنید). در اینجا یک قطعه از فایل تولید شده است:
تعاریفی را برای توابعی که می خواهید فراخوانی کنید، در صورتی که به طور کامل تعریف نشده اند، ارائه دهید. از کد ++C (همانطور که در بالا نشان داده شده است) استفاده کنید تا بفهمید کدام توابع باید تعریف شوند.
حالا رابط را با فراخوانی بسازید:
build(definecrypto)Building interface file 'cryptoInterface.dll'. Interface file 'cryptoInterface.dll' built in folder 'C:\BlogPost\crypto'. To use the library, add the interface file folder to the MATLAB path.
build(definecrypto) ساخت فایل رابط «cryptoInterface.dll».
فایل رابط «cryptoInterface.dll» در پوشه «C:\BlogPost\crypto» ساخته شده است.
برای استفاده از کتابخانه، پوشه فایل رابط را به مسیر MATLAB اضافه کنید. ))
لطفا توجه داشته باشید: شما به یک کامپایلر C++ نیاز دارید که با کامپایلری که کتابخانه با آن ساخته شده است سازگار باشد.
اکنون آماده تماس با کتابخانه در متلب هستیم. مهمتر از همه، ما رابطی داریم که ناشران می توانند آن را با کاربران نهایی به اشتراک بگذارند، و آنها برای فراخوانی کتابخانه نیازی به کامپایلر یا C++ ندارند. فراخوانی این کتابخانه C++ در متلب مانند فراخوانی هر کد دیگری از کد متلب است.
وارد کردن کتابخانه SpaceCrypto
addpath('crypto') loc = 'cryptopp700'; dllLoc = fullfile(loc, 'x64\DLL_Output\Release'); path = getenv('PATH'); setenv('PATH', [dllLoc ';' path]); import clib.crypto.*
رمزگذاری پیام اصلی
cryptObj = SpaceCrypto.CryptBlowFish; cryptObj.setPlainString("MATLAB Speaks C++!"); % Use MATLAB strings cryptObj.setKey("mySecUreKey!!"); encryptedMessage = cryptObj.Encrypt()encryptedMessage = "3540541C31806EDD0FED2AD653A9B1EAD224D192AA281B26"
رمزگشایی و بازیابی پیام اصلی
cryptObj = SpaceCrypto.CryptBlowFish; cryptObj.setEncString(encryptedMessage); cryptObj.setInputMode(SpaceCrypto.OUT_TYPE.HEX); % MATLAB enum for C++ enum cryptObj.setKey("mySecUreKey!!"); cryptObj.setOutputMode(SpaceCrypto.OUT_TYPE.NORMAL); originalMessage = cryptObj.DecryptoriginalMessage = "MATLAB Speaks C++!"
سعی کنید با کتابخانه ++C خودتان رابط داشته باشید
از مراحل توضیح داده شده در بالا برای بسته بندی کتابخانه C++ که می خواهید در MATLAB فراخوانی کنید استفاده کنید. سند ما را بخوانید
برای یادگیری بیشتر در 19a ما بسیاری از ساختارهای C++ 98 مانند توابع، کلاسها، متدها، نمونههای قالب و تایپدفها را پشتیبانی میکنیم. در آینده، ما از std::vector، اشاره گرهای هوشمند، رشته های گسترده و موارد دیگر پشتیبانی خواهیم کرد. همچنین قصد داریم از مدیریت خودکار حافظه برای اشیاء ++C در MATLAB پشتیبانی کنیم. ما به بهبود این ویژگی ادامه میدهیم، و مایلم از شما بشنوم. در زیر نظر دهید و به ما بگویید که چگونه برای شما پیش رفت یا فکر میکنید چه قابلیتهایی را باید به آن اضافه کنیم. تازه داریم شروع می کنیم!
MATLAB به زبان C++
منتشر شده با MATLAB® R2019a
دیدگاه خود را بنویسید