2009-06-17 4 views
6

Как передать дескриптор функции matlab объекту Java и вызывать его из Java (то есть, я хочу, чтобы Java указывала Matlab, когда она была готова к вычислению). Я пытаюсь использовать класс com.mathworks.jmi.Matlab для оценки выражений Matlab в объекте Java, но я не вижу, как 1) передать дескриптор funcktion callback на Java и 2) вызвать его из Java, возможно используя класс com.mathworks.jmi.Matlab.Вызов обработчика callback/функции matlab из Java

Спасибо, Jakob

ответ

2

Хм. Похоже, JMI - одна из тех внутренних задач, которые могут быть изменены в будущих версиях. Я нашел эти онлайн-статьи, не уверен, что они помогут в вашем деле.

+0

Спасибо, я нашел эти статьи, но они не говорят мне, как передать функции handlescallbacks в java и вызывать их из java.Единственное, что мне нужно для работы через jmi, - это проверить команды matlab из java, но мне нужно указать matlab (из java) для выполнения определенного дескриптора функции. – 2009-06-17 16:23:50

+0

Я думаю, вы не можете этого сделать. Я столкнулся с подобной проблемой (пытаюсь передать функцию Matlab в качестве интерфейса обратного вызова в java-вызов от MATLAB - без видимого способа маршалировать в Matlab) и закончилась неудачей. –

0

Чтобы передать функцию обратного вызова в MATLAB, вы передаете имя функции MatLab и его аргументов в один com.mathworks.jmi.Matlab.feval («matlabControlcb», ..., 0); ... является объектом [], где [0] = команда и [1..end] = аргументы.

Смотрите также: FEVAL FUNC2STR

1

Я боюсь, что я не знаю способ сделать точно то, что вы просили, но есть два способа, которые вы можете сделать что-то подобное:

1) Если вы установили обратный вызов Java из Matlab, вы можете послать ему дескриптор функции Matlab. Когда событие обратного вызова Java будет поднято, будет активирована функция Matlab. Пример для этого можно найти здесь: http://UndocumentedMatlab.com/blog/uicontrol-callbacks/. Обратите внимание, что для этого не требуется JMI.

2) JMI нуждается в строке (имени функции или командной строке) для оценки Matlab. Если вы знаете имя функции заранее, вы можете ее использовать. В противном случае вы можете подготовить функцию Switch-yard Matlab (имя которой известно заранее), чтобы динамически направлять обратный вызов на соответствующее действие Matlab.

Я планирую запустить статью о JMI ​​в http://UndocumentedMatlab.com сайте в середине апреля, так что следите за обновлениями ...

Яир Альтман

+1

Другой способ сделать это - поднять событие из вашего Java-кода и поместить обратный вызов Matlab на это событие, как описано в http://undocumentedmatlab.com/blog/matlab-callbacks-for-java-events/ –

0

попробовать этот инструмент: http://jamal.sourceforge.net/

Он делает именно то, что вам необходимо и хорошо документировано.

Основным принципом, на котором он основан, является предоставление вызова RMI серверной части, которая запускается внутри Matlab. Результат возвращается в java-программу. Опять же, это зависит от jmi ...

1

matlabcontrol - это Java API, который позволит вам это сделать. Он может вызывать функцию MATLAB с использованием feval. Он не может работать непосредственно на дескрипторе функции, но, как упоминалось в KitsuneYMG, вы можете использовать func2str для преобразования дескриптора функции в строку. Чтобы начать работу, вы можете взглянуть на walkthrough.