12/11/2020
Bài 3: Giải phương trình bậc 2 (With MEX)
Bài code giải phương trình bậc 2 thì rất đơn giản rồi. Tuy nhiên trong bài này để tăng độ khó cho game thì mình có sử dụng MEX-files để kết nối giữa file C/C++ (ngoài ra thì còn nhiêu ngôn ngữ khác nữa như Fortran...) với Matlab, và vẫn ra kết quả như khi lập trình trong matlab (file .m bình thường)
Trong matlab, một công cụ rất quan trọng và cần phải tìm hiểu đó là MEX-files.
MEX là viết tắt của MATLAB Executable. Là một loại tệp thực thi tích hợp sẵn trong Matlab. Cái này ứng dụng trong rất nhiều thứ điển hình như làm về nhúng,...
Hiểu đơn giản thì khi bạn có một chương trình đuôi c. hoặc .cpp (C/C++), vậy để matlab thực thi chúng thì có 2 cách,
Một là viết lại theo ngôn ngữ Matlab, hoặc hai là sài MEX file để Matlab có thể đọc trực tiếp và thi hành chúng. Sự kết nối giữa C/C++ và matlab thì cần một chút tìm hiểu thêm về trình tự cách làm nhé. ^^!
Nào let's start.
1. Đầu tiên mình có 2 file .c và .h (để giải phương trình bậc 2 viết bằng ngôn ngữ C/C++)
1 file simulink để input đầu vào, output đầu ra display, và 1 khối S-function Builder. Ngoài ra có thể dùng công cụ Matlab Coder cũng ra được nhưng có lẽ cách này là đơn giản nhất.
2. Đặt S-function name (ví dụ mình đặt là: "name"), sau đó đặt các đầu vào, đầu ra (In/Out Port)
3. Build khối, cái mình cần quan tâm sau khi build khối đó là 2 file name.c (file này có khi mình build thành công ở bước 2), và một file name_wrapper.c
3. Khai báo một chút ở S-function Builder (một số chỗ như Output, Libraries) để nó nhận file .c(.cpp) và .h của mình ở bước 1.
4. Sắp xong rồi, tiếp theo là run cú pháp ở command window: mex + 3 file (2 file được build ra ở bước 3 + file C/C++ của mình nè)
5. Nó ra dòng chữ "MEX completed successfully." thì vui rồi.
6. Cuối cùng là run simulink thôi.
Goodluck! :))))
Note: Cơ bản thì là như vậy, sau này còn có rất nhiều thứ, ngôn ngữ lập trình khác kết nối với Matlab như Python, Perl, Java, ActiveX hoặc .NET...
Để đơn giản hơn mình có ví dụ về tính tổng 2 số ở bài sau.
30/10/2020
22/10/2020
25/09/2020
02/07/2020
10/02/2020
05/12/2019
11/11/2019