如何使用matlabcontrol.jar从Java调用用户定义的Matlab

Kas*_*ghe 9 java proxy matlab user-defined-functions matlab-deployment

我试图调用用户定义的Matlab函数(M文件),该函数从我在Eclipse中开发的Java应用程序中获取3个参数(Java字符串).目前我能够使用或等函数/命令调用proxy.evalproxy.feval方法.但是当我尝试调用用户定义的函数时,它在matlab控制台上说,没有像这样定义的函数,并且在Java控制台上发生.dispsqrMatlabInvocationException

然后我尝试使用一个简单的用户定义函数,该函数不带参数,只有单行,disp('Hello')但结果仍然相同.所以我认为不是类型转换问题,而是如何调用用户定义的函数.

请尽快有人帮帮我吗?我很快就要完成这个项目的截止日期.如果有人能提出解决方案,我会非常感激.(Joshuwa Kaplan先生,你的帖子中是否有关于解决此类问题的指南?我试过但没有找到任何内容)

提前致谢

Amr*_*mro 11

您必须在MATLAB搜索路径上拥有任何用户定义的m文件,就像您在MATLAB中正常工作一样.

我测试了以下示例:

C:\一些\路径\ myfunc.m

function myfunc()
    disp('hello from MYFUNC')
end
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我们编译并运行Java程序:

javac -cp matlabcontrol-4.0.0.jar HelloWorld.java
java -cp ".;matlabcontrol-4.0.0.jar" HelloWorld
Run Code Online (Sandbox Code Playgroud)

将打开一个MATLAB会话,并显示输出:

hello world
hello from MYFUNC
Run Code Online (Sandbox Code Playgroud)

您也可以将文件夹添加到路径一次,然后使用SAVEPATH将其保留.这样你就不必每次都这样做.