2009-07-25 30 views
7

Tôi đang sử dụng giao diện MEX để chạy mã C++ trong MATLAB. Tôi muốn thêm một số chức năng để MATLAB để xử lý một đối tượng System:Giao diện MATLAB MEX với đối tượng lớp có nhiều chức năng

sysInit() 
sysRefresh() 
sysSetAttribute(name, value) 
String = sysGetAttribute(value) 
sysExit() 

Vì mỗi dll MEX có thể chứa một hàm, tôi cần phải tìm một cách để lưu trữ các con trỏ đến các System đối tượng toàn cầu mà sẽ tồn tại cho đến khi đã bị xóa bởi một cuộc gọi đến sysExit.

Tôi có thể làm điều này trong MATLAB như thế nào? Có cách nào để lưu trữ con trỏ toàn cầu qua các cuộc gọi đến các hàm MEX không?

Trả lời

8

Một cách tiếp cận phổ biến là có một số hàm m-file cung cấp giao diện công khai, ví dụ: sysInit.m, sysRefresh.m, v.v.

Mỗi tệp m này gọi hàm mex với một loại xử lý nào đó, một chuỗi (hoặc số) xác định hàm cần gọi, và bất kỳ số arg bổ sung nào. Ví dụ, sysRefresh.m có thể trông giống như:

function sysRefresh(handle) 
return sysMex(handle, 'refresh') 

Trong chức năng sysMex mex của bạn, bạn có thể có tay cầm là một con trỏ đống thô (dễ dàng, nhưng không phải là rất an toàn), hoặc bạn có thể duy trì một ánh xạ trong C/C++ từ ID xử lý đến các con trỏ đối tượng thực tế. Giải pháp này đòi hỏi một chút công việc phụ, nhưng nó an toàn hơn nhiều. Bằng cách này, một người nào đó không thể vô tình vượt qua một số tùy ý như một tay cầm, hoạt động như một con trỏ lơ lửng. Ngoài ra, bạn có thể làm những điều quan trọng hơn như sử dụng chức năng onCleanup để giải phóng tất cả bộ nhớ và tài nguyên khi bạn bỏ chức năng mex (ví dụ: do đó bạn không phải khởi động lại matlab khi bạn biên dịch lại hàm mex).

Bạn có thể tiến xa hơn một chút nếu bạn thích và ẩn tay cầm đằng sau lớp Matlab. Đọc các tính năng OO cho Matlab trong tài liệu nếu bạn quan tâm. Nếu bạn đang sử dụng phiên bản gần đây, bạn có thể tận dụng các đối tượng xử lý sạch hơn của họ.

+1

Cảm ơn ông Fooz. Tôi đã thực hiện với xử lý (trực tiếp như con trỏ) và nó có vẻ là làm việc. Đây là một chút ngạc nhiên đối với tôi rằng đối tượng lớp được cấp phát trong heap, không bị xóa khi hàm mex trả về. Đây có phải là hành vi bình thường mà tôi có thể dựa vào Windows (XP, Vista và 7) không? Cảm ơn rất nhiều lần nữa. – Paul

+1

Nếu bạn phân bổ các đối tượng bằng cách sử dụng cấp phát của Matlab, chúng sẽ tự động bị xóa khi trở về từ hàm mex. Nếu bạn sử dụng malloc hoặc mới, sau đó Matlab không biết về chúng và do đó không de-phân bổ. –

3

Ngoài ra, bạn có thể không sử dụng MEX. Trong MATLAB (trên Windows), bạn có thể tải bất kỳ dll chung nào với loadlibrary và gọi bất kỳ chức năng nào của nó bằng callib. Tuy nhiên, điều này có lẽ không di động trên các hệ điều hành.

+0

Đây cũng là một gợi ý tốt. Tôi muốn sử dụng giao diện mex vì nó là cách chính thức để mở rộng MATLAB và tôi hy vọng sẽ tích hợp chặt chẽ với MATLAB. Cảm ơn bạn rất nhiều. – Paul

+0

Điều này dường như là cách được hỗ trợ để thực hiện. Các chức năng được ghi lại ở đây: http://www.mathworks.com/help/matlab/using-c-shared-library-functions-in-matlab-.html Một ví dụ về việc sử dụng chúng là ở đây: https: // github .com/smitec/rustlab/blob/d239e23a57c6c53dffd1b11c3e0e4fc193a3a0f7/src/test.m –

Các vấn đề liên quan