Octave 的难度 "javaMethod"

Difficulty with Octave's "javaMethod"

问题中,我试图将 java 类 导入 Octave。在我的特定示例中,我曾经(并且正在)使用 javaplex,一组 java 工具,其中包含用于在 Matlab 中实现的代码。问题的答案表明,在 Matlab 中,您将执行以下操作:

import edu.stanford.math.plex4.*;

api.Plex4.createExplicitSimplexStream();

问题中提供的答案表明Octave中的方法是

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

这工作得很好,但后来我 运行 遇到了一个 st运行ge 问题。还有一种方法叫做createVietorisRipsStream。在 Matlab 中,我会 运行 使用如下一行:

api.Plex4.createVietorisRipsStream(parameters); 

所以我认为 Octave 中的等效命令是

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

但是,当我这样做时,出现以下错误:

error: [java] java.lang.NoSuchMethodException: createVietorisRipsStream

我不确定为什么会出现此错误,两者都在同一个 JAVA 文件 ('Plex4') 中。我确实看过 Plex4 文件,我注意到 createExplicitSimplexStreamcreateVietorisRipsStream 之间有两个区别:

  1. 有两个实例createExplicitSimplexStream和六个实例createVietorisRipsStream

  2. 有一点说 <double[]>。但是我不知道这是否相关(我没有读过或写过多少 java,到目前为止,我已经能够使用 tutorial they provided 来只使用 Matlab 而没有看看引擎盖下)。

这是 Plex4 文件中的一个代码示例,用于 createExplicitSimplexStream:

public static ExplicitSimplexStream createExplicitSimplexStream(double maxFiltrationValue) {
    return new ExplicitSimplexStream(maxFiltrationValue);
}

这是 Plex4 文件中的一个代码示例,用于 createVietorisRipsStream:

public static VietorisRipsStream<double[]> createVietorisRipsStream(double[][] points, int maxDimension, double maxFiltrationValue, int numDivisions) {
    return FilteredStreamInterface.createPlex4VietorisRipsStream(points, maxDimension, maxFiltrationValue, numDivisions);
}

知道我为什么会遇到这个错误吗?

正确阅读 Java 部分的八度文档,只有 4 页,解释得很好!

正如我在上一个问题的评论中提到的,使用参数调用java方法的方法是:

javamethod(
name of method as a string,
name of class fully qualified with packages as a string,
method's first argument,
method's second argument,
... etc
)

这是调用'static'方法的唯一方法;使用普通的 'instance' 方法,您可以使用 javaMethod 并用 java 对象本身替换 class 的名称,或者像在 [=41] 中一样简单地使用它=],即 objectname.methodname(arg1, arg2, ... etc)

我在这里实现了教程供您查看(pdf 中的第 14 页)。 (不要忘记先 运行 修改后的 'load_javaplex' 脚本)。

octave:2> max_dimension = 3;
octave:3> max_filtration_value = 4;
octave:4> num_divisions = 1000;
octave:5> point_cloud = javaMethod( 'getHouseExample', 'edu.stanford.math.plex4.examples.PointCloudExamples')
point_cloud =

<Java object: double[][]>

octave:6> stream = javaMethod( 'createVietorisRipsStream', 'edu.stanford.math.plex4.api.Plex4', point_cloud, max_dimension, max_filtration_value, num_divisions) 
stream =

<Java object: edu.stanford.math.plex4.streams.impl.VietorisRipsStream>

octave:7> persistence = javaMethod( 'getModularSimplicialAlgorithm', 'edu.stanford.math.plex4.api.Plex4', max_dimension, 2)
persistence =

<Java object: edu.stanford.math.plex4.autogen.homology.IntAbsoluteHomology>

octave:8> intervals = persistence.computeIntervals(stream)
intervals =

<Java object: edu.stanford.math.plex4.homology.barcodes.BarcodeCollection>

(我没有更进一步,因为 plot_barcodes 也需要修改一点;它只有几行,但这里 post 太多了,推理是一样的虽然)。

此外,如果您不确定 class 构造函数、class 方法以及静态方法与特定于实例的方法的含义,不幸的是,这与 java,虽然它应该是相当介绍性的东西。值得先阅读一下。

祝你好运!