2009-06-17 39 views
6

Làm cách nào để truyền một hàm MATLAB xử lý đối tượng Java và gọi nó từ bên trong Java (nghĩa là, tôi muốn Java thông báo cho MATLAB khi nó sẵn sàng với một phép tính). Tôi đang cố gắng sử dụng lớp com.mathworks.jmi.Matlab để đánh giá các biểu thức Matlab trong đối tượng Java, nhưng tôi không thể thấy cách 1) chuyển giao xử lý gọi lại funcktion sang Java và 2) gọi nó từ Java có thể sử dụng lớp com.mathworks.jmi.Matlab.Gọi hàm gọi lại MATLAB/hàm xử lý từ Java

Xin cảm ơn, jakob

Trả lời

2

Hmm. Có vẻ như JMI là một trong những thứ trong đó có thể thay đổi trong các phiên bản sau. Tôi đã tìm thấy các bài viết trực tuyến này, không chắc liệu chúng có giúp ích gì trong trường hợp của bạn hay không.

+0

Cảm ơn, tôi đã tìm thấy các bài viết đó nhưng họ không cho tôi biết cách chuyển hàm handlecallbacks cho java và gọi chúng từ java.Điều duy nhất tôi đã làm việc thông qua jmi là để đánh giá các lệnh MATLAB từ java, nhưng tôi cần phải nói với MATLAB (từ java) để thực thi một hàm xử lý cụ thể. –

+0

Tôi đoán là bạn không thể làm điều đó. Tôi đã chạy vào một vấn đề tương tự (cố gắng để vượt qua trong một chức năng Matlab như một giao diện gọi lại vào một cuộc gọi java từ MATLAB - không có cách rõ ràng để soái vào MATLAB) và chạy ra khỏi may mắn. –

0

Để vượt qua một callback vào matlab, bạn vượt qua tên của hàm matlab và đó là lý lẽ vào com.mathworks.jmi.Matlab.feval ("matlabControlcb", ..., 0); ... là một đối tượng [] trong đó [0] = lệnh và [1..end] = đối số.

Xem thêm: FEVAL FUNC2STR

1

Tôi sợ rằng tôi không biết một cách để làm chính xác những gì mà bạn yêu cầu, nhưng có hai cách bạn có thể làm điều gì đó tương tự:

1) Nếu bạn thiết lập một cuộc gọi lại Java từ bên trong Matlab, bạn có thể gửi nó một xử lý hàm Matlab. Khi sự kiện gọi lại Java được nâng lên, hàm Matlab của bạn sẽ được gọi. Một ví dụ cho điều này có thể được tìm thấy ở đây: http://UndocumentedMatlab.com/blog/uicontrol-callbacks/. Lưu ý rằng điều này không cần JMI để chạy.

2) JMI cần một chuỗi (tên hàm hoặc dòng lệnh) cho Matlab để đánh giá. Nếu bạn biết tên hàm trước, bạn có thể sử dụng nó. Nếu không, bạn có thể chuẩn bị một chức năng chuyển đổi sân Matlab (có tên được biết trước) để tự động chuyển tiếp cuộc gọi lại của bạn đến hành động Matlab thích hợp.

tôi có kế hoạch để chạy một bài viết về JMI trong http://UndocumentedMatlab.com website vào giữa tháng tư, do đó, chơ ...

Yair Altman

+1

Một cách khác để làm điều này là nâng cao một sự kiện từ bên trong mã Java của bạn và đặt một cuộc gọi lại Matlab vào sự kiện này, như được mô tả trong http://undocumentedmatlab.com/blog/matlab-callbacks-for-java-events/ –

0

thử công cụ này: http://jamal.sourceforge.net/

Nó thực hiện chính xác những gì bạn cần và tài liệu tốt.

Nguyên tắc chính dựa trên đó là làm cho RMI gọi đến phần máy chủ được chạy bên trong Matlab. Đầu ra được trả về cho chương trình java. Một lần nữa, nó phụ thuộc vào jmi ...

1

matlabcontrol là một API Java cho phép bạn thực hiện điều đó. Nó có thể gọi một hàm MATLAB bằng feval. Nó không thể hoạt động trực tiếp trên một hàm xử lý, nhưng như đã đề cập bởi KitsuneYMG, bạn có thể sử dụng func2str để chuyển đổi một hàm xử lý thành một chuỗi. Để bắt đầu, bạn có thể xem qua số walkthrough.

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