如何使用 matlabcontrol 从 Java 调用 Matlab 函数而不每次都启动新会话?

Posted

技术标签:

【中文标题】如何使用 matlabcontrol 从 Java 调用 Matlab 函数而不每次都启动新会话?【英文标题】:How to call Matlab functions from Java using matlabcontrol without starting new session every time? 【发布时间】:2011-12-07 20:46:11 【问题描述】:

我正在使用 matlabcontrol 从 Java 调用 Matlab 函数

我的代码运行良好,但每当我在 Java 中运行代码时,它都会打开新的 Matlab 会话。 我根据 Javadoc 进行了编辑,但我想我错过了一些东西。

我也尝试过使用/不使用“proxy.disconnect()”,但它仍然会打开新的 Matlab 会话。 任何提示都会非常有帮助。我被卡住了..

下面是我的 Java 代码

import matlabcontrol.MatlabConnectionException;
import matlabcontrol.MatlabInvocationException;
import matlabcontrol.MatlabProxy;
import matlabcontrol.MatlabProxyFactory;
import matlabcontrol.MatlabProxyFactoryOptions;

public class callSaliencymap 

/**
 * @param args
 */
public static void main(String[] args) throws MatlabConnectionException, MatlabInvocationException

    //Create a proxy, which we will use to control MATLAB
    MatlabProxyFactory factory = new MatlabProxyFactory();
    MatlabProxy proxy = factory.getProxy();

    MatlabProxyFactoryOptions options = new MatlabProxyFactoryOptions.Builder()
    .setUsePreviouslyControlledSession(true)
    .setHidden(true)
    .build();

    factory = new MatlabProxyFactory(options);




    //Create proxy factory


    //test the saliencymap
    Object[] saliencylocation = proxy.returningFeval("runActivation",1,"tank.bmp",1);
    System.out.println(saliencylocation[0]);

    //Disconnect the proxy from MATLAB
    //proxy.disconnect();

【问题讨论】:

我想你的答案就在这里:***.com/questions/7212467/… 非常感谢,Rich。我检查了帖子并尝试运行代码,但它仍然会打开每个新的 Matlab 会话。我想我还是想念一些东西.. 我从未使用过matlabcontrol,所以无法提供更多建议。代码中的示例名为 addpath,然后在该目录中运行脚本。只有在一个持久性 matlab 会话中执行所有命令时,该示例才有效。这就是为什么我认为这是您正在寻找的解决方案。不知道你为什么投了反对票。 【参考方案1】:

这是我做的,希望对你有帮助

MatlabProxyFactoryOptions options = new MatlabProxyFactoryOptions.Builder()
    .setUsePreviouslyControlledSession(true)
    .setHidden(true)
    .setMatlabLocation(null).build(); 

    MatlabProxyFactory factory = new MatlabProxyFactory(options);
    MatlabProxy proxy = factory.getProxy();

【讨论】:

这成功了!非常感谢。还有一个问题是,这段代码对 matlabcontrol 以前打开的 Matlab 会话运行良好(因此,它不会打开每个新会话,并且只处理一个打开的会话!),但是当我使用这段代码打开一个“新的”Matlab一开始的session,Matlab只显示了一个命令窗口,没有显示工作区、当前目录等,你是不是也遇到了这个问题?【参考方案2】:

尝试直接使用 Matlab Engine 而不是 Matlab Control。

【讨论】:

【参考方案3】:
MatlabProxyFactoryOptions options = new MatlabProxyFactoryOptions.Builder()
                .setUsePreviouslyControlledSession(true)
                 //.setPort(2100)
                .build();           

MatlabProxyFactory factory=new MatlabProxyFactory(options );
MatlabProxy proxy=factory.getProxy();
proxy.disconnect();//this is very important

【讨论】:

以上是关于如何使用 matlabcontrol 从 Java 调用 Matlab 函数而不每次都启动新会话?的主要内容,如果未能解决你的问题,请参考以下文章

为啥matlabcontrol在代理创建时中断调用线程?

如何使用 SWIG 从 C++ 调用 Java?

如何使用 JAVA 从 html 页面获取表格

如何使用 QAndroidJniObject 从 Qt 内部调用 Java 代码?

如何使用 Java 日历从日期中减去 X 天?

如何使用 Java 代码从 Git 存储库下载文件