【问题标题】:using matlabcontrol API to call to call matlab function from Java within Netbeans在 Netbeans 中使用 matlabcontrol API 调用从 Java 调用 matlab 函数
【发布时间】:2012-03-01 00:45:00
【问题描述】:

我一直在尝试编辑以下 matlabcontrol 代码,但运行时仍然出现错误。请朋友们帮帮我!

package matcontro;

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:\\ Users\\HASENDE\\My Documents\\MATLAB')");
         proxy.feval("myfunc");
         proxy.eval("rmpath('C:\\ Users\\HASENDE\\My Documents\\MATLAB')");

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

我得到的错误如下;

运行:

线程“主”matlabcontrol.MatlabConnectionException 中的异常: 无法启动 MATLAB。命令:[matlab, -r, javaaddpath 'C:\Users\HASENDE\Documents\NetBeansProjects\Java 类路径 库\matlabcontrol-4.0.0.jar'; matlabcontrol.MatlabClassLoaderHelper.configureClassLoading(); javarmpath 'C:\Users\HASENDE\Documents\NetBeansProjects\Java 类路径 库\matlabcontrol-4.0.0.jar'; matlabcontrol.MatlabConnector.connectFromMatlab('PROXY_RECEIVER_01caa56d-9ed7-4e39-a45b-345051024d49', 2100);]

在 matlabcontrol.RemoteMatlabProxyFactory.createProcess(RemoteMatlabProxyFactory.java:305) 在 matlabcontrol.RemoteMatlabProxyFactory.requestProxy(RemoteMatlabProxyFactory.java:116)

在 matlabcontrol.RemoteMatlabProxyFactory.getProxy(RemoteMatlabProxyFactory.java:134)

    at matlabcontrol.MatlabProxyFactory.getProxy(MatlabProxyFactory.java:81)

    at matcontro.HelloWorld.main(HelloWorld.java:21)

原因:java.io.IOException: Cannot run program "matlab": CreateProcess error=2, The system cannot find the file specified at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) 在 matlabcontrol.RemoteMatlabProxyFactory.createProcess(RemoteMatlabProxyFactory.java:292) ... 4 更多

原因:java.io.IOException: CreateProcess error=2, 系统 找不到指定的文件

    at java.lang.ProcessImpl.create(Native Method)

    at java.lang.ProcessImpl.<init>(ProcessImpl.java:188)

    at java.lang.ProcessImpl.start(ProcessImpl.java:132)

    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021)   ... 5 more

Java 结果:1

构建成功(总时间:4 秒)

【问题讨论】:

  • matlab 是否已安装并在您的 PATH 中?
  • 是的,我已经在同一台计算机上安装了 matlab。我的函数位于上面定义的确切路径上,但是“你的路径”是什么意思? @madth3
  • 嗯,在我看来,java 正在尝试调用 Matlab 程序但没有找到它。虽然我看到您正在创建的 MatlabProxy 应该连接到已经启动的 Matlab 实例,所以我不确定是否需要 Matlab 的位置。

标签: java matlab


【解决方案1】:

问题在于 Windows 和 Linux 上的 matlabcontrol 需要理解“matlab”,因为 MATLAB 目录是 PATH 环境变量的一部分。此异常表明情况并非如此。没关系,您只需要显式设置 MATLAB 可执行文件的位置即可。来自javadoc for setMatlabLocation(...)

设置将启动 MATLAB 的 MATLAB 可执行文件或脚本的位置。如果无法成功使用设置的值来启动 MATLAB,则在尝试创建代理时将引发异常。

MATLAB 可执行文件的绝对路径可以通过运行 MATLAB 来确定。在 OS X 或 Linux 上,在命令行窗口中计算 [matlabroot '/bin/matlab']。在 Windows 上,在命令行窗口中计算 [matlabroot '/bin/matlab.exe']。提供的位置不必是绝对路径,只要操作系统可以解析路径即可。

Windows

将理解与以下相关的位置:

  • 当前工作目录
  • 仅 Windows 目录(不搜索子目录)
  • Windows\System32 目录
  • PATH 环境变量中列出的目录
  • 在注册表中使用键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths 定义的应用路径

默认情况下,在 Windows 上,MATLAB 会在注册表中放置一个 App Path 条目,以便使用 matlab 启动 MATLAB。如果未设置此属性,则将使用此 App Path 条目。

OS X

将理解与以下相关的位置:

  • 当前工作目录
  • PATH 环境变量中列出的目录

在 OS X 上,MATLAB 作为应用程序包安装在 /Applications/ 中。如果未设置此属性,则将使用应用程序包中的可执行文件。

Linux

将理解与以下相关的位置:

  • 当前工作目录
  • PATH 环境变量中列出的目录

在 Linux 上的安装过程中,MATLAB 可以创建一个名为 matlab 的符号链接,该链接可用于启动 MATLAB。如果未设置此属性,则将使用此符号链接。

【讨论】:

    【解决方案2】:

    为了补充答案,我遇到了类似的问题(我使用的是 Intellij IDEA 和 Matlab R2014a)。实际上,环境变量路径中缺少程序的确切路径。可以找到一些 matlab 路径(或在安装 matlab 时自动编写),例如“C:\Program Files\MATLAB\MATLAB Runtime\”或“C:\Program Files \MATLAB\MATLAB Compiler\”,但只有包含 .exe 工作的那个,例如“C:\Program Files\MATLAB\R2014a\bin”。然而,在我重新启动 IDE 之前,我的程序无法运行。请记住这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2015-02-28
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多