Как вызвать пользовательский Matlab из Java с помощью matlabcontrol.jar - PullRequest
9 голосов
/ 27 августа 2011

Я пытаюсь вызвать пользовательскую функцию Matlab (файл M), которая принимает 3 аргумента (строки Java) из моего приложения Java, разработанного в Eclipse. В настоящее время я могу вызывать методы proxy.eval и proxy.feval с такими функциями / командами, как disp или sqr. Но когда я пытаюсь вызвать пользовательскую функцию, она говорит на консоли Matlab, что такой функции не определено, и на консоли Java MatlabInvocationException происходит.

Затем я попытался с помощью простой пользовательской функции, которая не принимает аргументов и имеет только одну строку disp('Hello'), но результат все тот же. Поэтому я думаю, что проблема преобразования пользовательских типов заключается не в проблеме преобразования типов.

Пожалуйста, кто-нибудь может мне помочь в ближайшее время? Я очень скоро уложусь в срок для этого проекта. Я был бы очень благодарен, если кто-то может найти решение. (Мистер Джошува Каплан, есть ли в ваших сообщениях руководство по решению такой проблемы? Я пытался, но ничего не нашел)

Заранее спасибо

1 Ответ

11 голосов
/ 27 августа 2011

В пути поиска MATLAB должны быть любые пользовательские m-файлы, как если бы вы нормально работали внутри MATLAB.

Я тестировал на следующем примере:

C: \ некоторый \ путь \ myfunc.m

function myfunc()
    disp('hello from MYFUNC')
end

HelloWorld.java

import matlabcontrol.*;

public class HelloWorld
{
    public static void main(String[] args)
        throws MatlabConnectionException, MatlabInvocationException
    {
         // create proxy
         MatlabProxyFactoryOptions options =
            new MatlabProxyFactoryOptions.Builder()
                .setUsePreviouslyControlledSession(true)
                .build();
        MatlabProxyFactory factory = new MatlabProxyFactory(options);
        MatlabProxy proxy = factory.getProxy();

        // call builtin function
        proxy.eval("disp('hello world')");

        // call user-defined function (must be on the path)
        proxy.eval("addpath('C:\\some\\path')");
        proxy.feval("myfunc");
        proxy.eval("rmpath('C:\\some\\path')");

        // close connection
        proxy.disconnect();
    }
}

Мы компилируем и запускаем программу Java:

javac -cp matlabcontrol-4.0.0.jar HelloWorld.java
java -cp ".;matlabcontrol-4.0.0.jar" HelloWorld

откроется сеанс MATLAB и отобразится вывод:

hello world
hello from MYFUNC

Вы также можете добавить папку в путь один раз, а затем сохранить ее с помощью SAVEPATH. Таким образом, вам не придется делать это каждый раз.

...