在 Octave 中导入 Java 类

Importing Java Classes in Octave

我一直难以弄清楚如何做到这一点。从the Octave website, it seems that java classes are found via a class path. This Stack Overflow answer表示"static java path"到"dynamic java path"。但是我不确定如何设置静态 java 路径。

在我感兴趣的特定情况下,我正在尝试将 javaplex 包与 Octave 一起使用 - 我已经在 Github 上联系了 javaplex 的作者,他们说如果Octave能加载javaclasses,那我就可以用了。据我所知,Octave 可以做到这一点。我的难点如下。

我正在使用为 Matlab 编写的代码,Octave 和 Matlab 与 Java 交互方式的差异给我带来了一些麻烦。我必须将 Octave 的目录设置为

C:\...\javaplex-master\javaplex-master\dist\matlab-examples-4.3.4\matlab_examples

从这里开始,我在命令 window 中 运行 命令“load_javaplex”,其中 运行 是脚本“load_javaplex.m”。然而,在这个脚本中有行

javaaddpath('./lib/javaplex.jar');

import edu.stanford.math.plex4.*;

其中“edu.stanford.math.plex4.*”是 java class(tutorial 还明确建议 运行 宁第二行)。

我发现这在 Octave 中不起作用(至于 Java 接口,我不能只使用 Matlab 代码),所以我需要将它添加到我的 java class访问它的路径。但是我不知道如何在 Octave 中执行此操作。我应该在标识静态 class 路径的目录中保存某种 .txt 文件吗?关于如何在 Octave 中加载 java classes 的任何一般信息?我很难通过网上提供的信息弄清楚如何做到这一点。在 class 路径中添加一些内容后我该怎么办?

好消息是,将 java 指令从 matlab 语法转换为八度语法非常容易。

坏消息是,您必须将 matlab 语法转换为八度语法。虽然这很简单,但这确实意味着您可能必须在提供的 m 文件 以及 中搜索任何 java 调用(而不仅仅是在您自己的代码中)并调整句法。 (显然,您可能会想出一个很好的方法来自动化该过程。)

以下是我如何让 tutorial 在八度音阶上工作:

  • 我下载了 matlab_examples zip 文件并按照说明解压缩(我在桌面上解压缩文件夹,即在我的机器上这导致文件夹 /home/tasos/Desktop/matlab_examples
  • 我打开 Octave 并 cd 进入那个目录
  • 打开 load_javaplex.m 文件并删除所有 import 语句,然后 运行 它到 "initialize" javaplex。
  • 您现在可以按照教程中的说明运行命令api.Plex4.createExplicitSimplexStream(),但是,首先您需要注意两件事:

    1. Octave 不提供从包中导入 java classes 的方法,因此您所有的 class 调用都需要 fully 包合格。 IE。 api 包的 Plex4 class 实际上需要完全限定为 edu.stanford.math.plex4.api.Plex4。您可以确认 Plex4api 包的 class,它本身是 edu.stanford.math.plex4 包的(子)包,方法是打开 .jar 文件并浏览其文件夹结构.

    2. 创建 java 对象、调用 java 方法等的语法在 octave 中与在 matlab 中不同。参见 relevant page in the octave manual for details.

因此 api.Plex4.createExplicitSimplexStream() 旨在调用(不带参数)edu.stanford.math.plex4.api 包中 Plex4 class 的 createExplicitSimplexStream 方法, 将在八度内调用如下:

javaMethod( 'createExplicitSimplexStream', 'edu.stanford.math.plex4.api.Plex4')

然后输出为教程中描述的答案。

说了这么多,请注意,虽然您不能直接 import classes 或(子)包来避免必须一直重写长包字符串,但 Octave 的 java interface does 似乎非常依赖字符串,这意味着将这么长的字符串存储为变量并在必须访问 [=84 时重用它们相当容易=].所以,例如您可以将字符串 'edu.stanford.math.plex4.' 保存到一个名为 plex4 的变量中,然后只需在您的代码中调用 javaMethod('createExplicitSimplexStream', [plex4, 'api.Plex4']) 等,这样可以 稍微 不那么麻烦.

玩得开心。